//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;
}

posted on 2011-08-20 11:25  NKHe!!oWor!d  阅读(208)  评论(0编辑  收藏  举报