You are given a sequence of n integers a1, a2, . . . , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , . . . , aj .
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100000+5, LEN = 50;
int a[N], val[N], cnt[N], num[N], lef[N], righ[N];
int d[N][LEN], len;
//游码编程
void RLE(int n){
memset(cnt,0,sizeof(0));
len = 1;
val[len] = a[1];
cnt[len] = 1;
num[len] = len;
lef[len] = 1;
for(int i = 2; i <= n; i++){
if( a[i] == a[i-1]){
cnt[len]++;
num[i] = len;
}else {
righ[len] = i-1;
len++;
val[len] = a[i];
cnt[len] = 1;
num[i] = len;
lef[len] = i;
}
}
}
void RMQ_init(){
for(int i = 1; i <= len; i++ ){
d[i][0] = cnt[i];
}
for(int j = 1; (1<<j) <= len+1; j++){ //1~len进行递推
for(int i = 1; i+(1<<j)-1 <= len; i++){
d[i][j] = max(d[i][j-1], d[i+(1<<(j-1))][j-1]);
}
}
}
int RMQ(int l,int r){
int k = 0;
while((1<<(k+1)) <= r-l+1) k++; //如果2^(k+1) <= R-L+1,那么k还可以加1。
return max(d[l][k], d[r-(1<<k)+1][k]);
}
int main(int argc, char** argv) {
int n, q;
while( scanf("%d",&n) == 1 && n){
scanf("%d",&q);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
RLE(n);
RMQ_init();
while( q--){
int l, r;
scanf("%d%d",&l,&r);
if(num[l] == num[r]){
printf("%d\n", r-l+1);
}else{
int ans=0;
if(num[l]+1 <= num[r]-1)
ans=RMQ(num[l]+1,num[r]-1);
ans = max(ans,max(righ[num[l]]-l+1,r-lef[num[r]]+1));
printf("%d\n",ans);
}
}
}
return 0;
}