#include<bits/stdc++.h>
#define NN 200005
using namespace std;
int n,m,b,x,l,r,a[200005],tr[NN<<7],lson[NN<<7],rson[NN<<7],sum[NN<<7];
const int N=3e5+3;
int cnt=0;
int build(int l,int r){
int rt=++cnt;
if(l==r) return rt;
else{
int mid=(l+r)>>1;
lson[rt]=build(l,mid);
rson[rt]=build(mid+1,r);
return rt;
}
}
int upd(int pre,int l,int r,int x){
int rt=++cnt;
if(l==r){
sum[rt]++;
return rt;
}
else{
int mid=(l+r)>>1;
lson[rt]=lson[pre];
rson[rt]=rson[pre];
sum[rt]=sum[pre];
if(x<=mid) lson[rt]=upd(lson[pre],l,mid,x);
else rson[rt]=upd(rson[pre],mid+1,r,x);
sum[rt]=sum[lson[rt]]+sum[rson[rt]];
return rt;
}
}
int find(int root,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr) return sum[root];
else{
int mid=(l+r)>>1;
int su=0;
if(mid>=ql) su+=find(lson[root],l,mid,ql,qr);
if(mid<qr) su+=find(rson[root],mid+1,r,ql,qr);
return su;
}
}
int main(){
cin>>n>>m;
tr[0]=build(0,N);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
tr[i]=upd(tr[i-1],0,N,a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&b,&x,&l,&r);
int ans=0;
for(int j=17;j>=0;j--){
int down,up,ff=0,fff=0;
down=ans-x,up=ans+(1<<j)-1-x;
if(find(tr[r],0,N,down,up)-find(tr[l-1],0,N,down,up)>0) ff=1;
down=ans+(1<<j)-x,up=ans+(1<<(j+1))-1-x;
if(find(tr[r],0,N,down,up)-find(tr[l-1],0,N,down,up)>0) fff=1;
if(b&(1<<j)){
if(ff==1) ans+=0;
else if(fff==1) ans+=(1<<j);
}
else{
if(fff==1) ans+=(1<<j);
else if(ff==1) ans+=0;
}
}
printf("%d\n",ans^b);
}
}