#include <bits/stdc++.h>
using namespace std;
const int N = 6e5 + 10;
int s[N]; // s[i]代表a[1]^a[2]^...^a[i],s[0]=0
int n, m;
int len = 23; // 0<=a[i]<=1e7,最多23位,所以最多23*N个结点
int ver[25 * N], idx; // ver代表每个结点所属版本,idx代表树中每个结点的编号
int son[25 * N][2]; //每个结点的孩子的编号
int root[N]; // s[0~N]->每插入一个算一个版本,有版本0~N,root代表每个版本的根
// 三个参数代表,当前版本的根now,前一个版本的根pre,当前版本号i
void insert(int now, int pre, int i) {
ver[now] = i;
for (int k = len; k >= 0; k--) {
int u = s[i] >> k & 1;
son[now][!u] = son[pre][!u];
son[now][u] = ++idx;
now = son[now][u], pre = son[pre][u];
ver[now] = i;
}
}
//在版本[l-1,r-1]中查找最大值,三个参数分别为root[r-1],l-1,定值s[n]^x
int query(int R, int L, int v) {
int res = 0;
for (int k = len; k >= 0; k--) {
int u = v >> k & 1;
//如果可以走反方向
if (ver[son[R][!u]] >= L) {
res |= 1 << k;
R = son[R][!u];
} else
R = son[R][u];
}
return res;
}
int main() {
cin >> n >> m;
ver[0] = -1; //结点编号为0代表空结点
root[0] = ++idx;
//插入s[0]产生版本0
insert(root[0], 0, 0);
for (int i = 1; i <= n; i++) {
cin >> s[i];
s[i] ^= s[i - 1];
root[i] = ++idx;
//每插入一个s[i]产生一个版本
insert(root[i], root[i - 1], i);
}
// m次询问
for (int i = 1; i <= m; i++) {
char op;
cin >> op;
if (op == 'A') {
n++;
cin >> s[n];
s[n] ^= s[n - 1];
root[n] = ++idx;
insert(root[n], root[n - 1], n);
} else {
int l, r, x;
cin >> l >> r >> x;
cout << query(root[r - 1], l - 1, x ^ s[n]) << endl;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSA2ZTUgKyAxMDsKCmludCBzW05dOyAgLy8gc1tpXeS7o+ihqGFbMV1eYVsyXV4uLi5eYVtpXSxzWzBdPTAKaW50IG4sIG07CmludCBsZW4gPSAyMzsgICAgICAgICAgLy8gMDw9YVtpXTw9MWU3LOacgOWkmjIz5L2NLOaJgOS7peacgOWkmjIzKk7kuKrnu5PngrkKaW50IHZlclsyNSAqIE5dLCBpZHg7ICAvLyB2ZXLku6Pooajmr4/kuKrnu5PngrnmiYDlsZ7niYjmnKwsaWR45Luj6KGo5qCR5Lit5q+P5Liq57uT54K555qE57yW5Y+3CmludCBzb25bMjUgKiBOXVsyXTsgICAgLy/mr4/kuKrnu5PngrnnmoTlranlrZDnmoTnvJblj7cKaW50IHJvb3RbTl07ICAgICAgICAgICAvLyBzWzB+Tl0tPuavj+aPkuWFpeS4gOS4queul+S4gOS4queJiOacrCzmnInniYjmnKwwfk4scm9vdOS7o+ihqOavj+S4queJiOacrOeahOaguQoKLy8g5LiJ5Liq5Y+C5pWw5Luj6KGoLOW9k+WJjeeJiOacrOeahOaguW5vdyzliY3kuIDkuKrniYjmnKznmoTmoLlwcmUs5b2T5YmN54mI5pys5Y+3aQp2b2lkIGluc2VydChpbnQgbm93LCBpbnQgcHJlLCBpbnQgaSkgewogICAgdmVyW25vd10gPSBpOwogICAgZm9yIChpbnQgayA9IGxlbjsgayA+PSAwOyBrLS0pIHsKICAgICAgICBpbnQgdSA9IHNbaV0gPj4gayAmIDE7CiAgICAgICAgc29uW25vd11bIXVdID0gc29uW3ByZV1bIXVdOwogICAgICAgIHNvbltub3ddW3VdID0gKytpZHg7CiAgICAgICAgbm93ID0gc29uW25vd11bdV0sIHByZSA9IHNvbltwcmVdW3VdOwogICAgICAgIHZlcltub3ddID0gaTsKICAgIH0KfQovL+WcqOeJiOacrFtsLTEsci0xXeS4reafpeaJvuacgOWkp+WAvO+8jOS4ieS4quWPguaVsOWIhuWIq+S4unJvb3Rbci0xXSxsLTEs5a6a5YC8c1tuXV54CmludCBxdWVyeShpbnQgUiwgaW50IEwsIGludCB2KSB7CiAgICBpbnQgcmVzID0gMDsKICAgIGZvciAoaW50IGsgPSBsZW47IGsgPj0gMDsgay0tKSB7CiAgICAgICAgaW50IHUgPSB2ID4+IGsgJiAxOwogICAgICAgIC8v5aaC5p6c5Y+v5Lul6LWw5Y+N5pa55ZCRCiAgICAgICAgaWYgKHZlcltzb25bUl1bIXVdXSA+PSBMKSB7CiAgICAgICAgICAgIHJlcyB8PSAxIDw8IGs7CiAgICAgICAgICAgIFIgPSBzb25bUl1bIXVdOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBSID0gc29uW1JdW3VdOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKaW50IG1haW4oKSB7CiAgICBjaW4gPj4gbiA+PiBtOwogICAgdmVyWzBdID0gLTE7ICAvL+e7k+eCuee8luWPt+S4ujDku6Pooajnqbrnu5PngrkKICAgIHJvb3RbMF0gPSArK2lkeDsKICAgIC8v5o+S5YWlc1swXeS6p+eUn+eJiOacrDAKICAgIGluc2VydChyb290WzBdLCAwLCAwKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGNpbiA+PiBzW2ldOwogICAgICAgIHNbaV0gXj0gc1tpIC0gMV07CiAgICAgICAgcm9vdFtpXSA9ICsraWR4OwogICAgICAgIC8v5q+P5o+S5YWl5LiA5Liqc1tpXeS6p+eUn+S4gOS4queJiOacrAogICAgICAgIGluc2VydChyb290W2ldLCByb290W2kgLSAxXSwgaSk7CiAgICB9CiAgICAvLyBt5qyh6K+i6ZeuCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspIHsKICAgICAgICBjaGFyIG9wOwogICAgICAgIGNpbiA+PiBvcDsKICAgICAgICBpZiAob3AgPT0gJ0EnKSB7CiAgICAgICAgICAgIG4rKzsKICAgICAgICAgICAgY2luID4+IHNbbl07CiAgICAgICAgICAgIHNbbl0gXj0gc1tuIC0gMV07CiAgICAgICAgICAgIHJvb3Rbbl0gPSArK2lkeDsKICAgICAgICAgICAgaW5zZXJ0KHJvb3Rbbl0sIHJvb3RbbiAtIDFdLCBuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgbCwgciwgeDsKICAgICAgICAgICAgY2luID4+IGwgPj4gciA+PiB4OwogICAgICAgICAgICBjb3V0IDw8IHF1ZXJ5KHJvb3RbciAtIDFdLCBsIC0gMSwgeCBeIHNbbl0pIDw8IGVuZGw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=