显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int B=710;
int n,m,lastans,len;
int a[N],b[N],bel[N],st[B],ed[B];
int f[B][B],sum[N],p[N];
vector<int>pos[N];
int read()
{
int x=0;char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
return x;
}
void init()
{
len=ceil((double)n/B);
for(int i=1;i<=len;i++){st[i]=ed[i-1]+1;ed[i]=min(i*B,n);}
for(int i=1;i<=len;i++)
for(int j=st[i];j<=ed[i];j++)
bel[j]=i;
for(int i=1;i<=len;++i)
{
for(int j=i;j<=len;++j)
{
f[i][j]=f[i][j-1];
for(int k=st[j];k<=ed[j];k++)
f[i][j]=max(f[i][j],++sum[a[k]]);
}
for(int j=st[i];j<=n;++j)sum[a[j]]=0;
}
}
int ask(int l,int r)
{
int bl=bel[l],br=bel[r];
if(bl==br)
{
int res=0;
for(int i=l;i<=r;++i) res=max(res,++sum[a[i]]);
for(int i=l;i<=r;++i) sum[a[i]]=0;
return res;
}
int res=f[bl+1][br-1];
for(int i=l;i<=ed[bl];++i)
{
while(res+p[i]<pos[a[i]].size()&&pos[a[i]][res+p[i]]<=r) res++;
}
for(int i=st[br];i<=r;++i)
{
while(p[i]-res>=0&&pos[a[i]][p[i]-res]>=l) res++;
}
return res;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i){a[i]=read();b[i]=a[i];}
sort(b+1,b+n+1);
int tot=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i)
{
a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
pos[a[i]].push_back(i);
p[i]=pos[a[i]].size()-1;
}
init();
while(m--)
{
int l=read(),r=read();
l^=lastans;r^=lastans;
if(l>r)swap(l,r);
lastans=ask(l,r);
printf("%d\n",lastans);
}
return 0;
}