#include <bits/stdc++.h>
#include <tmmintrin.h>
using namespace std;
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define FF first
#define SS second
template<class T>
void maxi(T& x, T y){
if(x < y) x = y;
}
template<class T>
void mini(T& x, T y){
if(x > y) x = y;
}
const double EPS = 1e-10;
const double PI = acos(-1.0);
const LL MOD = 1e9+7;
constexpr int BLOCK = 4;
__attribute__((aligned(16)))
int as[100010];
__attribute__((aligned(16)))
int lacc[100010];
__attribute__((aligned(16)))
int racc[100010];
__attribute__((aligned(16)))
int lacc_b[100010/BLOCK];
__attribute__((aligned(16)))
int tmp[4];
inline int iceil(int a, int b){
return (a + b - 1) / b;
}
__attribute__((always_inline))
inline __m128i my_mm_max_epi32(__m128i a, __m128i b){
__asm("pmaxsd %1, %0" : "+x" (a) : "xm" (b));
return a;
}
//#define USE_SSE
int main(){
cin.tie(0);
ios_base::sync_with_stdio(false);
int N, Q;
cin >> N >> Q;
REP(i,N) cin >> as[i];
for(int i=0;i+BLOCK<=N;i+=BLOCK){
lacc[i] = as[i];
FOR(j,1,BLOCK)
lacc[i+j] = lacc[i+j-1] & as[i+j];
lacc_b[i/BLOCK] = lacc[i+BLOCK-1];
}
racc[0] = as[0];
FOR(i,1,N)
racc[i] = racc[i-1] ^ as[i];
int ans;
int l, r;
cin >> l >> r;
--l;
REP(q,Q){
if(r-l < 2 || r > N || l < 0) break;
// solve ans(0-index)
ans = 1<<31;
int a = ~0;
const int bb = l/BLOCK;
const int be = (r-1)/BLOCK;
const int R = racc[r-1];
//FOR(i,l,r) cout<<as[i]<<","; cout<<endl;
if(bb == be){
for(int i=l;i<r-1;++i){
a &= as[i];
maxi(ans, a - (R ^ racc[i]));
}
}
else{
FOR(i,l,(bb+1)*BLOCK){
a &= as[i];
maxi(ans, a - (R ^ racc[i]));
//cout<<i<<","<<a<<"-"<<(R ^ racc[i])<<":"<<ans<<endl;
}
#ifdef USE_SSE
auto X = _mm_set1_epi32(R);
auto maxs = _mm_set1_epi32(ans);
for(int b=bb+1;b<be;++b){
const int ix = b * BLOCK;
auto a_dup = _mm_set1_epi32(a);
auto aa = _mm_load_si128((__m128i const*)&lacc[ix]);
auto ands = _mm_and_si128(a_dup, aa);
auto xx = _mm_load_si128((__m128i const*)&racc[ix]);
auto xss = _mm_xor_si128(X, xx);
auto res = _mm_sub_epi32(ands, xss);
maxs = my_mm_max_epi32(maxs, res);
a &= lacc_b[b];
}
_mm_store_si128((__m128i*)tmp, maxs);
ans = max(max(tmp[0], tmp[1]), max(tmp[2], tmp[3]));
#else
for(int b=bb+1;b<be;++b){
for(int d=0;d<BLOCK;++d){
const int ix = b * BLOCK + d;
int a_ = a & lacc[ix];
int x_ = R ^ racc[ix];
maxi(ans, a_ - x_);
}
a &= lacc_b[b];
}
#endif
for(int i=be*BLOCK;i<r-1;++i){
a &= as[i];
maxi(ans, a - (R ^ racc[i]));
}
}
cout << ans << endl;
ans = abs(ans);
if(q < Q-1){
cin >> l >> r;
l = (l + ans) % N + 1;
r = (r + ans) % N + 1;
--l;
}
}
return 0;
}