#include<bits/stdc++.h>
using namespace std;
template<int lim>
struct trie{
static int const N=1000020;
int rev(int x){
int ans=0;
for(int i=0;i<lim;++i) ans+=((x>>i)&1)<<(lim-i-1);
return ans;
}
int v[N],rt[N],sz[25*N],tot,lf[25*N],ch[2][25*N];
int New(){tot++;return tot;}
void insert(long long x,int r){
v[r]=x;
x=rev(x);
rt[r]=New();
int p=rt[r],q=rt[r-1];
for(int i=1;i<=lim;i++){
ch[(x&1)^1][p]=ch[(x&1)^1][q];
ch[x&1][p]=New();
sz[ch[x&1][p]]=sz[ch[x&1][q]]+1;
p=ch[x&1][p];
q=ch[x&1][q];
x>>=1;
}
lf[p]=r;
}
int kth(int k,int l,int r){
int q=rt[l-1],p=rt[r];
while(ch[1][p] || ch[0][p])
{
int temp=sz[ch[0][p]]-sz[ch[0][q]];
if(temp<k){
p=ch[1][p];
q=ch[1][q];
k-=temp;
}
else {
q=ch[0][q],p=ch[0][p];
}
}
return v[lf[p]];
}
int getxor(int l,int r,int x){
int tp=x;
x=rev(x);
int q=rt[l-1],p=rt[r];
while(ch[1][p] || ch[0][p])
{
if(!(sz[ch[(x&1)^1][p]]-sz[ch[(x&1)^1][q]])){
p=ch[x&1][p];
q=ch[x&1][q];
}
else {
q=ch[(x&1)^1][q],p=ch[(x&1)^1][p];
}
x>>=1;
}
return v[lf[p]]^tp;
}
};
trie<30> tr;
int sum[1000060];
int main(){
tr.rt[0]=tr.New();
int n,m;
scanf("%d%d",&n,&m);
tr.insert(0,1);
sum[0]=0;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
sum[i]=sum[i-1]^x;
tr.insert(sum[i],i+1);
}
for(int i=1;i<=m;i++){
char op[2];
scanf("%s",&op);
if(op[0]=='A'){
int x;
n++;
scanf("%d",&x);
tr.insert(x,n+1);
sum[n]=sum[n-1]^x;
}
else{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",tr.getxor(l,r,x^sum[n]));
}
}
}