题意:给定一个非降序的数列,然后进行查询操作,问范围 [l,r] 内出现频率最高的数字出现了多少次
思路:RMQ
//a[i]表示左边与data[i]相同的节点数(包括自己);b[i]表示右边与data[i]相同的节点数(包括自己)
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
#define maxn 100005
int data[maxn],a[maxn],b[maxn],st[maxn][20],n,q,l,r;
void stinit()
{
for(int i=1;i<=n;++i)
st[i][0]=a[i];
for(int j=1; (1<<j)<=n; ++j)
for(int i=1; (i+(1<<(j-1))-1)<=n;++i)
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
void abinit()
{
a[1]=1;
for(int i=2;i<=n;++i)
{
if(data[i]==data[i-1])
a[i]=a[i-1]+1;
else
a[i]=1;
}
b[n]=1;
for(int i=n-1;i>=1;--i)
{
if(data[i]==data[i+1])
b[i]=b[i+1]+1;
else
b[i]=1;
}
}
void query(int lt,int rt)
{
if(data[rt]==data[lt])
{
printf("%d\n",a[rt]-a[lt]+1);
return;
}
if(lt+b[lt]>rt-a[rt])
{
printf("%d\n",max(b[lt],a[rt]));
return;
}
else
{
int k=log(rt-a[rt]-lt-b[lt]+1.0)/log(2.0);
printf("%d\n",max( max(b[lt],a[rt]),max(st[lt+b[lt]][k],st[rt-a[rt]-(1<<k)+1][k]) ));
}
}
int main()
{
while(scanf("%d",&n))
{
if(n==0) break;
scanf("%d",&q);
for(int i=1;i<=n;++i)
scanf("%d",&data[i]);
abinit();
stinit();
for(int i=1;i<=q;++i)
{
scanf("%d%d",&l,&r);
query(l,r);
}
}
return 0;
}