#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 9,SqrtN = 710;
int n,m,ans;
int a[N];
int block_cnt,block_len;
int p[SqrtN][SqrtN];
int s[SqrtN][N];
void build(){
block_cnt = (int)sqrt(n);
}
int belong(int id){
return id / block_cnt + 1;
}
int start(int id){
return n / block_cnt * (id - 1) + 1;
}
int end(int id){
return n / block_cnt * id;
}
int cnt[N];
void init(){
for(int i = 1;i <= block_cnt;i++){
for(int j = 1;j <= n;j++)
s[i][j] = s[i - 1][j];
for(int j = start(i);j <= end(i);j++)
s[i][a[j]]++;
}
for(int i = 1;i <= block_cnt;i++){
int Max = INT_MAX,Max_cnt = 0;
memset(cnt,0,sizeof cnt);
for(int j = i;j <= block_cnt;j++){
for(int k = start(j);k <= end(j);k++){
cnt[a[k]]++;
if(cnt[a[k]] > Max_cnt || (cnt[a[k]] == Max_cnt && a[k] < Max)){
Max = a[k];
Max_cnt = cnt[a[k]];
}
}
p[i][j] = Max;
}
}
}
int query(int l,int r){
int pos_l = belong(l),pos_r = belong(r);
int Max = INT_MAX,Max_cnt = 0;
memset(cnt,0,sizeof cnt);
int ret = p[pos_l + 1][pos_r - 1],ret_cnt = s[pos_r - 1][ret] - s[pos_l][ret];
if(pos_l == pos_r){
for(int i = l;i <= r;i++){
cnt[a[i]]++;
if(cnt[a[i]] > Max_cnt || (cnt[a[i]] == Max_cnt && a[i] < Max)){
Max = a[i];
Max_cnt = cnt[a[i]];
}
}
return Max;
}
for(int i = l;i <= end(pos_l);i++)
cnt[a[i]]++;
for(int i = start(pos_r);i <= r;i++)
cnt[a[i]]++;
ret_cnt += cnt[ret];
for(int i = l;i <= end(pos_l);i++){
int val = cnt[a[i]] + s[pos_r - 1][a[i]] - s[pos_l][a[i]];
if(val > Max_cnt || (val == Max_cnt && a[i] < Max)){
Max = a[i];
Max_cnt = val;
}
}
for(int i = start(pos_r);i <= r;i++){
int val = cnt[a[i]] + s[pos_r - 1][a[i]] - s[pos_l][a[i]];
if(val > Max_cnt || (val == Max_cnt && a[i] < Max)){
Max = a[i];
Max_cnt = val;
}
}
if(Max_cnt > ret_cnt)
ret = Max;
return s[pos_r - 1][ret] - s[pos_l][ret] + cnt[ret];
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1;i <= n;i++)
scanf("%d", &a[i]);
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);
}
}