#include"iostream"
#include"string.h"
#include"vector"
using namespace std;
const int maxn=5e4+5;
int W;
struct Tree
{
int l,r;
};
Tree tree[maxn*32];
int a[maxn];
int N,M;
int tot;
vector<int> root;
void BuildTree()
{
root.push_back(tot);
int now=tot;
for(int i=W;i>=0;i--)
{
int tp=(0>>i)&1;
tree[now++].l=++tot;
}
}
void Insert(int id1,int x)
{
tot++;
root.push_back(tot);
int now=tot;
for(int i=W;i>=0;i--)
{
int tp=(x>>i)&1;
if(tp==0)
{
tree[now].l=++tot;
if(tree[id1].r!=-1)
{
tree[now].r=tree[id1].r;
}
id1=tree[id1].l;
now=tree[now].l;
}
else
{
tree[now].r=++tot;
if(tree[id1].l!=-1)
{
tree[now].l=tree[id1].l;
}
id1=tree[id1].r;
now=tree[now].r;
}
}
}
int Query(int L,int R,int x)
{
int ans=0;
L--;
int id1=root[L];
int id2=root[R];
for(int i=W;i>=0;i--)
{
int tp=(x>>i)&1;
int t=tp^1;
if(t==1)
{
if(tree[id2].r!=-1&&(tree[id2].r!=tree[id1].r))
{
id2=tree[id2].r;
id1=tree[id1].r;
ans|=(1<<i);
}
else
{
id2=tree[id2].l;
id1=tree[id1].l;
}
}
else
{
if(tree[id2].l!=-1&&(tree[id2].l!=tree[id1].l))
{
id1=tree[id1].l;
id2=tree[id2].l;
}
else
{
id1=tree[id1].r;
id2=tree[id2].r;
ans|=(1<<i);
}
}
}
ans^=x;
return ans;
}
int main()
{
W=30;
while(cin>>N>>M)
{
memset(tree,-1,sizeof(tree));
tree[-1].l=tree[-1].r=-1;
tot=0;
BuildTree();
for(int i=1;i<=N;i++)
{
cin>>a[i];
Insert(root[i-1],a[i]);
}
for(int i=1;i<=M;i++)
{
int L,R,X;
cin>>X>>L>>R;
L++;
R++;
cout<<Query(L,R,X)<<"\n";
}
}
}