数据结构 RMQ算法 左右左右 写得有点晕了 。。。。。
/*************************************************************************
> Author: xlc2845 > Mail: xlc2845@gmail.com
> Created Time: 2013年11月07日 星期四 11时05分22秒
************************************************************************/
#include <cstdio>
//#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define LL long long
#define maxn 100010
using namespace std;
int val[maxn], cou[maxn], n, q, num[maxn], left[maxn], right[maxn], d[maxn][100];
void init()
{
memset(val, 0, sizeof(val));
memset(cou, 0, sizeof(cou));
memset(d, 0, sizeof(d));
}
void init_RMQ(int k)
{
for(int i = 0; i < k; i++)
d[i][0] = cou[i];
for(int j = 1; (1 << j) <= n; j++)
for(int i = 0; i+(1 << j) - 1 < n; i++)
d[i][j] = max(d[i][j-1], d[i+(1 << (j-1))][j-1]);
}
int RMQ(int L, int R)
{
if(L > R)
return 0;
int k = 0;
while((1 << (k+1)) <= R-L+1) k++;
return max(d[L][k], d[R-(1 << k)+1][k]);
}
int main()
{
while(scanf("%d", &n) == 1 && n)
{
init();
scanf("%d",&q);
int j = 1, x;
scanf("%d", &x);
left[j] = 1;
num[1] = j;
val[1] = x;
cou[1] = 1;
for(int i = 2; i <= n; i++)
{
scanf("%d", &x);
if(x == val[j])
{
num[i] = j;
cou[j]++;
}
else
{
right[j] = i-1;
j++;
val[j] = x;
num[i] = j;
cou[j] ++;
left[j] = i;
}
}
right[j] = n;
init_RMQ(j);
while(q--)
{
int rr,ll;
scanf("%d%d", &ll, &rr);
int R = num[rr], L = num[ll];
if(R == L) printf("%d\n", rr-ll+1);
else
{
int ans = right[L]-ll+1;
ans = max(rr-left[R]+1, ans);
ans = max(ans, RMQ(L+1, R-1));
printf("%d\n",ans);
}
}
}
return 0;
}