#include <bits/stdc++.h>
#define maxn 500005
using namespace std;
struct Node{
int value,id;
}tmp[maxn];
int a[maxn],cnt[maxn],b[maxn];
int L[710],R[710];
int f[710][710];
vector<int> v[maxn];
int pos[maxn];
bool cmp(Node a,Node b){
return a.value<b.value;
}
int main(){
ios::sync_with_stdio(false); cin.tie(0);
int n,m,size,l,r,lastans,block;
while(cin>>n>>m){
size=sqrt(n);
for(register int i=1;i<=n;i++){
cin>>tmp[i].value; tmp[i].id=i;
}
sort(tmp+1,tmp+n+1,cmp);
for(int i=1;i<=n;i++) v[a[i]].clear();
for(register int i=1;i<=n;i++){
if(tmp[i].value==tmp[i-1].value)
a[tmp[i].id]=a[tmp[i-1].id];
else a[tmp[i].id]=i;
b[i]=(i-1)/size+1;
v[a[i]].push_back(i);
pos[i]=v[a[i]].size()-1;
}
lastans=0; R[0]=0; block=(n-1)/size+1;
for(int i=1;i<=block;i++){
L[i]=R[i-1]+1; R[i]=size*i;
}R[block]=n;
memset(f,0,sizeof(f));
for(register int i=1;i<=block;i++){
memset(cnt,0,sizeof(cnt));
for(register int j=i;j<=block;j++){
int &F=f[i][j];
F=f[i][j-1];
for(register int k=L[j];k<=R[j];k++)
F=max(F,++cnt[a[k]]);
}
}
memset(cnt,0,sizeof(cnt));
while(m--){
cin>>l>>r;
l^=lastans; r^=lastans;
lastans=0;
if(b[l]==b[r]){
for(register int i=l;i<=r;i++)
cnt[a[i]]++,lastans=max(lastans,cnt[a[i]]);
for(register int i=l;i<=r;i++) cnt[a[i]]=0;
}
else{
lastans=f[b[l]+1][b[r]-1];
for(register int i=l;i<=R[b[l]];i++){
int it=pos[i];
while(it+lastans<v[a[i]].size()&&v[a[i]][it+lastans]<=r)
lastans++;
}
for(register int i=L[b[r]];i<=r;i++){
int it=pos[i];
while(it-lastans>=0&&v[a[i]][it-lastans]>=l)
lastans++;
}
}
cout<<lastans<<endl;
}
}
}
救救蒟蒻吧~谢谢