#include<bits/stdc++.h>
using namespace std;
#define Ri register int
const int N = 500010, B = 710;
int q, A[B][B], cnt[N], n, a[N], in[N], L[B], R[B], pos[N]; vector<int> v[N]; int b[N];
inline int ask(int l, int r) {
if(in[l] == in[r]) {
int mx = 0;
for(Ri i = l; i <= r; i++) cnt[a[i]] = 0;
for(Ri i = l; i <= r; i++) mx = max(mx, ++cnt[a[i]]);
return mx;
}
int ans = A[in[l] + 1][in[r] - 1];
for(Ri i = l; i <= R[in[l]]; i++) {
int j = pos[i];
while(j + ans < v[a[i]].size() && v[a[i]][j + ans] <= r) ans++;
}
for(Ri i = L[in[r]]; i <= r; i++) {
int j = pos[i];
while(j >= ans && v[a[i]][j - ans] >= l) ans++;
}
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin >> n >> q;
int B0 = sqrt(n);
for(int i = 1; i <= n; i++) cin >> a[i], b[i] = a[i];
stable_sort(b + 1, b + 1 + n); int tot = unique(b + 1, b + 1 + n) - b - 1;
for(int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + 1 + tot, a[i]) - b;
for(int i = 1; i <= n; i++) {
in[i] = (i + B0 - 1) / B0;
v[a[i]].push_back(i);
pos[i] = v[a[i]].size() - 1;
}
int blo = in[n];
for(int i = 1; i <= blo; i++) L[i] = (i - 1) * B0 + 1, R[i] = min(i * B0, n);
for(int i = 1; i <= blo; i++) {
memset(cnt, 0, sizeof cnt);
for(int j = i; j <= blo; j++) {
A[i][j] = A[i][j - 1];
for(Ri k = L[i]; k <= R[j]; k++) A[i][j] = max(A[i][j], ++cnt[a[k]]);
}
}
int lst = 0;
while(q--) {
int l, r; cin >> l >> r;
l ^= lst, r ^= lst;
if(l > r) swap(l, r);
cout << (lst = ask(l, r)) << '\n';
}
return 0;
}