//7021#9198299 helloworld 3368 Accepted 5412K 500MS C++ 2996B 2011-08-20 11:10:37 //9198356 NKHelloWorld 3368 Accepted 5616K 1110MS G++ 2537B 2011-08-20 11:17:51 //9198361 NKHelloWorld 3368 Accepted 5412K 500MS C++ 2537B 2011-08-20 11:18:15 //9198392 NKHelloWorld 3368 Accepted 5412K 469MS C++ 2967B 2011-08-20 11:21:11 /* 先分组,对每个数的频率存入freq,对freq进行RMQ,这样回答每一次查询分为三种情况。 */ #include <cstdio> #include <cmath> using namespace std; #define MAXN 100010 int n,q,left[MAXN],right[MAXN],index[MAXN],freq[MAXN],num[MAXN],mmax[MAXN][20]; int pow2[] = { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072 }; int max(int a,int b) { return a>b?a:b; } void initrmq(int indexcount) { int i,j; for(i=1;i<=indexcount;i++) { mmax[i][0] = freq[i]; } for(j=1;pow2[j]<=indexcount;j++) { for(i=1;i+pow2[j]-1<=indexcount;i++) { mmax[i][j] = max( mmax[i][j-1],mmax[i+pow2[j-1]][j-1] ); } } } int query_rmq(int a,int b) { int k = int( log(double(b-a+1))/log(2.0) ); return max( mmax[a][k],mmax[b-pow2[k]+1][k] ); } int main() { int i,j,a,b,freqcount,indexcount,temp,temp2; while(scanf("%d",&n),n!=0) { num[0] = -100000000; scanf("%d",&q); indexcount = 0; for(i=1;i<=n;i++) { scanf("%d",&num[i]); if(num[i]==num[i-1]) { left[i] = left[i-1]; index[i] = index[i-1]; freqcount++; } else { freq[indexcount] = freqcount; left[i] = i; index[i] = ++indexcount; freqcount = 1; for(j=i-1;num[j] == num[i-1];j--) { right[j] = i-1; } } } freq[indexcount] = freqcount; for(j=i-1;num[j] == num[i-1];j--) right[j] = i-1; initrmq(indexcount); for(i=1;i<=q;i++) { scanf("%d%d",&a,&b); if(index[a]==index[b]) { printf("%d\n",b-a+1); } else if(index[a]+1==index[b]) printf("%d\n",max(right[a]-a+1,b-left[b]+1)); else printf("%d\n",max(query_rmq(index[a]+1,index[b]-1), max(right[a]-a+1,b-left[b]+1))); } } return 0; }