#include <bits/stdc++.h>
#define ch(i, x) tr[i].ch[x]
#define siz(i) tr[i].siz
const int N= 2e5+ 10, M= 2e5+ 10, inf= 1e9+ 10;
inline int read() {
int x= 0, f= 1; char ch= getchar();
for (; ! isdigit(ch); ch= getchar()) if (ch== '-') f= -1;
for (; isdigit(ch); ch= getchar()) x= (x<< 3)+ (x<< 1)+ (ch^ 48);
return x*= f;
}
using namespace std;
int n, m, tot, rt[N], ver, a[N];
int val[N];
struct Trie { int ch[2], siz; } tr[N];
int copynode( int k) { tr[++tot]= tr[k]; return tot; }
void ins( int k, int x) {
for ( int i= 32; i>= 0; i--) {
int bit= ((x>> i)& 1);
k= copynode(k); ch(k, bit)= ++tot, siz(k)+= 1;
k= ch(k, bit);
} k= copynode(k); siz(k)+= 1;
}
int ask( int k1, int k2, int x) {
int res= 0;
for ( int i= 32; i>= 0; i--) {
int bit= ((x>> i)& 1);
if (siz(k2)- siz(k1)) res+= (1<< i), k1= ch(k1, bit^ 1), k2= ch(k2, bit^ 1);
else k1= ch(k1, bit), k2= ch(k2, bit);
} return res;
}
signed main() {
n= read(), m= read();
for ( int i= 1; i<= n; i++) ver++, a[ver]= a[ver- 1]^ read(), rt[ver]= rt[ver- 1], ins(rt[ver], a[ver]);
for ( int i= 1; i<= n; i++) cout<<a[i]<<" ";
while (m--) {
char op[5]; scanf("%s", op); int l, r, x;
if (op[0]== 'A') x= read(), ver++, a[ver]= a[ver- 1]^ x, rt[ver]= rt[ver- 1], ins(rt[ver], a[ver]);
else {
l= read(), r= read(), x= read();
printf("%d\n", ask(rt[l- 1], rt[r], x^ a[ver]));
}
}
}