//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;
}
转载于:https://www.cnblogs.com/nkhelloworld/archive/2011/08/20/2147031.html