#include<iostream>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
int read(int &x)
{
bool f=0; char t=getchar() ; x=0;
while(t<'0'||t>'9'){
if(t=='-') f=1;
if(t==EOF) return EOF ;
t=getchar() ;
}
while(t>='0'&&t<='9'){
x=(x<<1)+(x<<3)+t-'0' ;
t=getchar() ;
}
if(f) x=-x ;
return 0 ;
}
char get_c()
{
char t;
while((t=getchar())!=EOF){
if(!isspace(t))
break ;
}
return t;
}
struct node;
typedef node* tree;
struct node{
tree p[2] ;
int cnt ;
}nd[20000005];
int ndnum ;
tree root[600005] , null ;
inline tree news()
{
tree ret=&nd[++ndnum] ;
ret->p[0]=ret->p[1]=null ;
ret->cnt=0 ;
return ret ;
}
int n,m;
int A[600005] , q[55] , qnum=28;
void fenjie(int t)
{
for(int i=0;i<=28;++i) q[i]=0 ;
int now=28 ;
while(t){
q[now--]=(t&1) ;
t>>=1 ;
}
}
void add_it(tree s1,tree &s2,int dep=0)
{
s2=news() ;
*s2=*s1 ;
s2->cnt ++ ;
if(dep>=qnum) return ;
add_it(s1->p[q[dep+1]],s2->p[q[dep+1]],dep+1) ;
}
int query_it(tree s1,tree s2)
{
int ret=0 ;
for(int i=1;i<=qnum;++i){
int tcnt=s2->p[q[i]^1]->cnt-s1->p[q[i]^1]->cnt ;
ret<<=1 ;
if(tcnt){
ret++ ;
s1=s1->p[q[i]^1] , s2=s2->p[q[i]^1] ;
}
else{
s1=s1->p[q[i]] , s2=s2->p[q[i]] ;
}
}
return ret;
}
int main()
{
read(n) ; read(m) ;
null=&nd[++ndnum] ;
null->p[0]=null->p[1]=null ;
null->cnt=0 ;
root[0]=null ;
int sum=0 ;
for(int i=1;i<=n;++i){
read(A[i]) ;
sum^=A[i] ;
fenjie(sum) ;
add_it(root[i-1],root[i]) ;
}
for(int i=1;i<=m;++i){
char o=get_c();
if(o=='A'){
read(A[++n]) ;
sum^=A[n] ;
fenjie(sum) ;
add_it(root[n-1],root[n]) ;
}
if(o=='Q'){
int l,r,t ;
read(l) ; read(r) ; read(t) ;
t^=sum ;
fenjie(t) ;
int ans;
if((root[l-2<0?0:l-2]->cnt == root[r-1]->cnt)) ans=t ;
else ans=query_it(root[l-2<0?0:l-2],root[r-1]) ;
printf("%d\n",ans) ;
}
}
return 0 ;
}