const int MAXN=3e5+5,MAXM=24;
int root[MAXN<<1],ch[MAXN*50][2],val[MAXN*50],cnt;
void Insert(int &k,int p,int pos,int v){
k=++cnt;
val[k]=val[p]+1;
if(pos<0)return;
int dir=(v>>pos)&1;
ch[k][!dir]=ch[p][!dir];
Insert(ch[k][dir],ch[p][dir],pos-1,v);
}
int query(int k1,int k2,int v){
int ans=0,pos=MAXM-1;
while(~pos){
int dir=(v>>pos)&1;
if(val[ch[k2][!dir]]-val[ch[k1][!dir]])
ans|=(1<<pos),k1=ch[k1][!dir],k2=ch[k2][!dir];
else
k1=ch[k1][dir],k2=ch[k2][dir];
pos--;
}
return ans;
}
int s[MAXN];
int main()
{
int n=read_int(),m=read_int(),pre=0;
Insert(root[1],root[0],MAXM-1,0);
n++;
_rep(i,2,n){
pre=pre^read_int();
Insert(root[i],root[i-1],MAXM-1,pre);
}
char opt;
int l,r,x;
while(m--){
opt=get_char();
if(opt=='A'){
pre=pre^read_int();
Insert(root[n+1],root[n],MAXM-1,pre);
n++;
}
else{
l=read_int(),r=read_int(),x=read_int();
enter(query(root[l-1],root[r],pre^x));
}
}
return 0;
}