利用数列不减将区间内元素个数最值转换为cnt数列最值(便捷处理)
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int d[100005][20];
int n,q,x,last,cntt,cc,ll;
int cnt[maxn],l[maxn],r[maxn],num[maxn];
void RMQ_init()
{
for(int i=1;i<=cntt;++i)
d[i][0]=cnt[i];
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i+(1<<j)-1<=n;++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++;
return max(d[L][k],d[R-(1<<k)+1][k]);
}
int main ()
{
while(scanf("%d",&n)&&n!=0)
{
scanf("%d",&q);
for(int i=1;i<=n;++i)
{
r[i]=-1;
scanf("%d",&x);
if(i==1)
last=x,cntt=1,cc=1,ll=i,num[i]=cntt,l[i]=ll;
else if(x==last)
{
cc++;
num[i]=cntt,l[i]=ll;
}
else {
cnt[cntt]=cc;
r[i-1]=i-1;
last=x;
cc=1;
cntt++;
ll=i,num[i]=cntt,l[i]=ll;
}
}
cnt[cntt]=cc;
r[n]=n;
RMQ_init();
int now,ans,L,R,p1,p2;
for(int i=n;i>=1;--i)
{
if(r[i]!=-1)
{
now=r[i];
}
else {
r[i]=now;
}
}
for(int i=1;i<=q;++i)
{
scanf("%d%d",&L,&R);
if(num[L]==num[R])
{
printf("%d\n",R-L+1);
}
else {
p1=cnt[num[L]]-(L-l[L]);
p2=cnt[num[R]]-(r[R]-R);
ans=max(p2,p1);
if(num[L]+2<=num[R])
{
ans=max(ans,RMQ(num[L]+1,num[R]-1));
}
printf("%d\n",ans);
}
}
}
return 0;
}