Files
OI-source/2.11235.cpp
2023-08-03 09:22:52 +08:00

63 lines
1.1 KiB
C++

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,q,now,x,s,l,r;
int v[maxn],cnt[maxn],num[maxn],left[maxn],right[maxn];
int d[maxn][20];
void RMQ_init(int *A,int n)
{
for(int i=0;i<n;i++) d[i][0]=A[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=0;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)
{
if(L>R) return 0;
int k=0;
while((1<<(k+1))<=R-L+1) k++;
return max(d[L][k],d[R-(1<<k)+1][k]);
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
while(scanf("%d%d",&n,&q)==2)
{
scanf("%d",v);
cnt[0]=1;
now=0;
for(int i=1;i<n;i++)
{
scanf("%d",&x);
if(x==v[now]) cnt[now]++;
else
{
now++;
v[now]=x;
cnt[now]=1;
}
}
s=x=0;
for(int i=0;i<=now;i++)
{
for(int j=0;j<cnt[i];j++,x++)
num[x]=i,left[x]=s,right[x]=s+cnt[i]-1;
s+=cnt[i];
}
RMQ_init(cnt,now+1);
while(q-->0)
{
scanf("%d%d",&l,&r);
l--;r--;
if(num[l]==num[r]) printf("%d\n",r-l+1);
else printf("%d\n",max(max(right[l]-l+1,r-left[r]+1)
,RMQ(num[l]+1,num[r]-1)));
}
}
return 0;
}