#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 9,SqrtN = 710;
int n,m,ans;
int a[N],tmp[N],len;
int block_cnt,block_len;
struct block{
int start,end;
} b[SqrtN];
int belong[N];
int p[SqrtN][SqrtN];
vector<int> id[N];
int at[N];
void build(){
block_cnt = block_len = (int)sqrt(n);
for (int i = 1;i <= block_cnt;i++) {
b[i].start = b[i - 1].end + 1;
b[i].end = block_len * i;
}
b[block_cnt].end = n;
for (int i = 1;i <= block_cnt;i++)
for (int j = b[i].start;j <= b[i].end;j++)
belong[j] = i;
}
int cnt[N];
void init(){
for(int i = 1;i <= block_cnt;i++){
int Max_cnt = 0;
memset(cnt,0,sizeof cnt);
for(int j = i;j <= block_cnt;j++){
for(int k = b[j].start;k <= b[j].end;k++)
Max_cnt = max(Max_cnt,++cnt[a[k]]);
p[i][j] = Max_cnt;
}
}
}
int query(int l,int r){
int pos_l = belong[l],pos_r = belong[r];
memset(cnt,0,sizeof cnt);
int ret = p[pos_l + 1][pos_r - 1];
if(pos_l == pos_r){
ret = 0;
for(int i = l;i <= r;i++)
ret = max(ret,++cnt[a[i]]);
return ret;
}
for(int i = l;i <= b[pos_l].end;i++)
for(;at[i] + ret < id[a[i]].size() && id[a[i]][at[i] - ret] <= r;ret++)
for(int i = b[pos_r].start;i <= r;i++)
for(;at[i] - ret >= 0 && id[a[i]][at[i] - ret] >= l;ret++)
return ret;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1;i <= n;i++){
scanf("%d", &a[i]);
tmp[i] = a[i];
}
sort(tmp + 1,tmp + n + 1);
len = unique(tmp + 1,tmp + n + 1) - tmp - 1;
for(int i = 1;i <= n;i++){
a[i] = lower_bound(tmp + 1,tmp + len + 1,a[i]) - tmp;
id[a[i]].push_back(i);
at[i] = id[a[i]].size() - 1;
}
build();
init();
for(int i = 1;i <= m;i++){
int l,r;
scanf("%d%d", &l, &r);
l ^= ans;
r ^= ans;
if(l > r)
swap(l,r);
ans = query(l,r);
printf("%d\n",ans);
}
}