RMQ预处理的复杂度为O(nlgn),询问的复杂度为O(1)
//离散化:从小到大记录这个序列每个值的起始位置、结束位置和频数
#define N 100010
int max(int a,int b){return a>b?a:b;}
int dp[18][N];//dp[i][j]表示从j开始,长度为2^i区间最大值(最小值)
int f[N];//以相同的数为一区间,记录频率
int s[N],t[N];//离散化,记录左右区间下标
int n,m;
void init_rmq(){
int i,j;
for(i=1;i<=n;i++){
dp[0][i] = f[i];
}
int t = floor(log((double)n)/log(2.0));//向下取整
for(i=1;i<=t;i++){
for(j=1;j+(1<<(i-1))<=n;j++){
dp[i][j] = max(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
}
}
}
int find(int x){
int l = 1,r = n,mid;
while(l<=r){
mid = (l+r)>>1;
if(s[mid]>x){
r = mid-1;
} else if(t[mid]<x){
l = mid+1;
} else return mid;
}
}
int rmq(int i,int j){
int a = find(i),b = find(j);
int aa = a+1,bb = b-1;
int ans=1;
if(aa<=bb){
int k = floor(log((bb-aa+1)*1.0)/log(2.0));
ans = max(dp[k][aa],dp[k][bb-(1<<k)+1]);
}
if(a<b){
ans = max(ans,t[a]-i+1);
ans = max(ans,j-s[b]+1);
} else ans = max(ans,j-i+1);
return ans;
}
int main(){
while(scanf("%d",&n) && n){
scanf("%d",&m);
int a;
int i,j,k=0;
scanf("%d",&a);
int last = a;
int head = 1;
int cnt = 1;
for(i=2;i<=n;i++){
scanf("%d",&a);
if(a == last){
cnt++;
} else {
f[++k] = cnt;
s[k] = head;
t[k] = i-1;
head = i;
cnt=1;
last = a;
}
}
f[++k] = cnt;
s[k] = head;
t[k] = n;
n = k;
init_rmq();
while(m--){
scanf("%d%d",&i,&j);
printf("%d\n",rmq(i,j));
}
}
return 0;
}
/*
10 3
-1 -1 1 1 1 1 3 10 10 10
2 3
1 10
5 10
0
*/