#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define mn 500001
#define mt 709
#define reg register
std::vector<int> v[mn];
int a[mn],b[mn],pos[mn],bl[mn],l[mt],r[mt],tot[mn],mx[mt][mt];
struct node {
int b,loc;
} o[mn];
inline int read() {
reg int temp=0,pole=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') pole=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
temp=(temp<<1)+(temp<<3);
temp+=ch^48;
ch=getchar();
}
return temp*pole;
}
inline bool cmp(node a,node b) {
return a.b<b.b;
}
inline int query(int le,int ri) {
reg int ans=0,i,iter;
if(bl[le]==bl[ri]) {
for(i=le; i<=ri; ++i) tot[a[i]]=0;
for(i=le; i<=ri; ++i) ans=std::max(ans,++tot[a[i]]);
return ans;
}
ans=mx[bl[le]+1][bl[ri]-1];
for(i=le; i<=r[bl[le]]; ++i) {
iter=pos[i];
while(iter+ans<v[a[i]].size()&&v[a[i]][iter+ans]<=ri) ans++;
}
for(i=l[bl[ri]]; i<=ri; ++i) {
iter=pos[i];
while(iter-ans>=0&&v[a[i]][iter-ans]>=le) ans++;
}
return ans;
}
int main() {
reg int n,m,i,j,k,len=0,t,la=0,le,ri;
n=read(),m=read();
for(i=1; i<=n; ++i) o[i].b=read(),o[i].loc=i;
std::sort(o+1,o+n+1,cmp);
for(i=1; i<=n; ++i) {
if(o[i].b!=o[i-1].b) len++;
a[o[i].loc]=len;
}
for(i=1; i<=n; ++i) {
v[a[i]].push_back(i);
pos[i]=v[a[i]].size();
pos[i]--;
}
t=sqrt(n);
for(i=1; i<=n; ++i) bl[i]=(i-1)/t+1;
for(i=1; i<=bl[n]; ++i) {
l[i]=(i-1)*t+1;
r[i]=i*t;
}
r[bl[n]]=n;
for(i=1; i<=bl[n]; ++i) {
memset(tot,0,sizeof tot);
for(j=i; j<=bl[n]; ++j) {
mx[i][j]=mx[i][j-1];
for(k=l[j]; k<=r[j]; ++k) mx[i][j]=std::max(mx[i][j],++tot[a[k]]);
}
}
for(i=1; i<=m; ++i) {
le=read(),ri=read();
le^=la,ri^=la;
if(l>r) std::swap(l,r);
printf("%d\n",la=query(le,ri));
}
return 0;
}
问题似乎是在main上(从题解里随便找一个main改改移植上去就过了,也不知道怎么回事……)