#include <bits/stdc++.h>
using namespace std;
const int N = 6e5+10; //注意这里起始有3e5,又可能插入3e5
const int M = N * 25;
int rt[N], tr[M][2]; //根,trie
int idx, cnt, br[M]; //根分配器,点分配器,点的相对版本
char op[2];
int n, m, s;
void insert(int v)
{
rt[++idx] = ++cnt; //创建新根
int x = rt[idx-1]; //前一个版本
int y = rt[idx]; //当前版本
for(int i = 23; i >= 0; i--)
{
int j = v >> i & 1; //提取每一位
tr[y][!j] = tr[x][!j]; //继承不同位值的点
tr[y][j] = ++cnt; //创建相同位值的点
x = tr[x][j], y = tr[y][j]; //跳
br[y] = br[x]+1; //声明所创建的相同位值得点为brand-new
}
}
int query(int l, int r, int v) //选择版本l-1和r
{
int retv = 0;
int x = rt[l-1];
int y = rt[r];
for(int i = 23; i >= 0; i--)
{
int j = v >> i & 1;
if(br[tr[y][!j]] > br[tr[x][!j]]) //若所求版本不一致,认定可行
{
y = tr[y][!j];
x = tr[x][!j];
retv += 1 << i;
}
else //若所求版本一致,认定冲突
{
y = tr[y][j];
x = tr[x][j];
}
}
return retv;
}
int main()
{
insert(0);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
s ^= x;
insert(s);
}
for(int i = 1; i <= m; i++)
{
int l;
scanf("%s%d", op, &l);
if(op[0] == 'A')
s ^= l, insert(s);
else if(op[0] == 'Q')
{
int r, x;
scanf("%d%d", &r, &x);
printf("%d\n", query(l, r, s ^ x));
}
}
}