#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f3f3f3f3f
#define clz __builtin_clz
#define lg(x) (31 - clz(x))
using namespace std;
const int maxn = 5e5+10,lim = lg(maxn)+1;
int n,m,l,r,x; char opt;
struct node{ int s[2],lst; }t[maxn];
int cnt,rt[maxn],a[maxn];
inline void insert(int &u,int x,int ver) {
for(int i = lim-1;~i;--i) {
t[++cnt] = t[*u], *u = cnt;
t[*u].lst = ver;
const int c = x >> i & 1;
u = t[*u].s+c;
}
t[++cnt] = t[*u], *u = cnt;
t[*u].lst = ver;
}
int get(int u,int x,int l) {
int ans = 0;
for(int i = lim-1;~i;--i) {
ans<<=1;
const int c = x >> i & 1;
if(t[u].s[!c][t].lst >= l) u = t[u].s[!c], ans |= 1;
else u = t[u].s[c];
} return ans;
}
signed main() {
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m;
for(int i = 1;i<=n;++i) {
cin>>a[i];
a[i] ^= a[i-1];
insert(rt[i] = rt[i-1],a[i],i);
}
while(m--) {
cin>>opt;
if(opt == 'A') {
cin>>x;
a[++n] = x;
a[n] ^= a[n-1];
insert((rt[n] = rt[n-1]),a[n],n);
} else {
cin>>l>>r>>x;
cout<<get(rt[r-1],a[n]^x,l-1)<<'\n';
}
}
}