#include<bits/stdc++.h>
#define L(i,j,k) for(int i=j;i<=k;i++)
#define R(i,j,k) for(int i=j;i>=k;i--)
#define ll long long
#define fi first
#define se second
using namespace std;
const int maxn=6e5+7;
int trie[maxn*25][2]; //数组定义字典树,存储下一个字符的位置
int ver[maxn*25],root[maxn],s[maxn]; //以某一字符串为前缀的单词的数量
int pos = 1;
void insert(int x,int y,int z){
ver[x]=z;
for(int k=23;k>=0;k--){
int c=s[z]>>k&1;
trie[x][!c]=trie[y][!c];
trie[x][c]=++pos;
x=trie[x][c];y=trie[y][c];
ver[x]=z;
}
}
int query(int x,int l,int v){
int res=0;
for(int k=23;k>=0;k--){
int c=v>>k&1;
if(ver[trie[x][!c]]>=l)
x=trie[x][!c],res+=1<<k;
else x=trie[x][c];
}
return res;
}
int main(){
int n,m;scanf("%d%d",&n,&m);
ver[0]=-1;
root[0]=++pos;
insert(root[0],0,0);
L(i,1,n) {
int x;scanf("%d",&x);
s[i]=s[i-1]^x;root[i]=++pos;
insert(root[i],root[i-1],i);
}
for(int i = 1; i <= m; i ++){
char c = getchar();if(c=='\n'||c==' ') c=getchar();
if(c=='\n'||c==' ') c=getchar();
if(c == 'A'){
int x;scanf("%d",&x);
s[n + 1] = s[n] ^ x,n ++,root[n] = ++pos;
insert(root[n ],root[n-1],n);
}else{int l,r,x;
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",query(root[r-1],l-1,x ^ s[n]));
}
}
}