#include <iostream>
#include <cstdio>
using namespace std;
struct segment
{
int lson,rson;
int cnt;
}tree[20000010];
int n,m;
int root[600010],xorsum,con,num;
int modify(int last,int val,int lv)
{
int now=++num;
if(lv<0) return now;
if(((val>>lv)&1)==1)
{
tree[now].lson=tree[last].lson;
tree[now].rson=modify(tree[last].rson,val,lv-1);
tree[tree[now].rson].cnt=tree[tree[last].rson].cnt+1;
}
else
{
tree[now].rson=tree[last].rson;
tree[now].lson=modify(tree[last].lson,val,lv-1);
tree[tree[now].lson].cnt=tree[tree[last].lson].cnt+1;
}
return now;
}
int find(int ver_l,int ver_r,int val,int lv)
{
if(lv<0) return 0;
if(((val>>lv)&1)==0)
{
if(tree[tree[ver_r].rson].cnt>tree[tree[ver_l].rson].cnt)
{
return (1<<lv)+find(tree[ver_l].rson,tree[ver_r].rson,val,lv-1);
}
else
{
return find(tree[ver_l].lson,tree[ver_r].lson,val,lv-1);
}
}
else
{
if(tree[tree[ver_r].lson].cnt>tree[tree[ver_l].lson].cnt)
{
return (1<<lv)+find(tree[ver_l].lson,tree[ver_r].lson,val,lv-1);
}
else
{
return find(tree[ver_l].rson,tree[ver_r].rson,val,lv-1);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
root[0]=0;
tree[0].lson=0;
tree[0].rson=0;
tree[0].cnt=0;
root[con+1]=modify(root[0],0,24);
con++;
for(int i=1;i<=n;i++)
{
int now;
scanf("%d",&now);
root[con+1]=modify(root[con],xorsum^now,24);
con++;
xorsum^=now;
}
for(int i=1;i<=m;i++)
{
char ch[3];
scanf("%s",ch);
if(ch[0]=='A')
{
int x;
scanf("%d",&x);
root[con+1]=modify(root[con],xorsum^x,24);
con++;
xorsum^=x;
}
else if(ch[0]=='Q')
{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
if(l-1>0) printf("%d\n",find(root[l-1],root[r],xorsum^x,24));
else printf("%d\n",find(root[1],root[r],xorsum^x,24));
}
}
}