structTrie_per { staticconstexprint SIZE = 2; staticconstexprint width = 24; // 值域小于2的width次方 structNode { int cnt; array<int, SIZE> next; Node() : cnt{0}, next{} {} }; vector<Node> t; vector<int> ver; Trie_per() { init(); } voidinit(){ t.assign(2, {}); ver.resize(1); } intnewNode(){ t.emplace_back(); return t.size() - 1; } intadd(int pre, const vector<int> &a){ int cur = newNode(); int p = pre, q = cur; t[q] = t[p]; for (auto x : a) { t[q].next[x] = newNode(); p = next(p, x); q = next(q, x); t[q] = t[p]; t[q].cnt++; } return cur; } intadd(int pre, int x){ // 转成01vector vector<int> a; for (int i = width - 1; i >= 0; i--) { a.push_back((x >> i) & 1); } returnadd(pre, a); } voidadd(int x){ // 外部接口 int pos = add(ver.back(), x); ver.push_back(pos); } // 查询x在版本(l,r]中和哪个数异或最大 intquerymx(int l, int r, int x){ // 传l-1进来 int res = 0; int p = ver[l], q = ver[r]; for (int i = width - 1; i >= 0; i--) { int u = (x >> i) & 1; int nxp = t[p].next[u ^ 1], nxq = t[q].next[u ^ 1]; if (t[nxq].cnt - t[nxp].cnt > 0) { res |= 1 << i; u ^= 1; } p = t[p].next[u]; q = t[q].next[u]; } return res; } intsize(){ return t.size(); } intcnt(int p){ return t[p].cnt; } intnext(int p, int x){ return t[p].next[x]; } };
voidsolve(){ int n, m; cin >> n >> m; vector<int> a(n + 1), sum(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] ^ a[i]; Trie_per tr; tr.add(0); for (int i = 1; i <= n; i++) tr.add(sum[i]); for (int i = 1; i <= m; i++) { string op; cin >> op; if (op == "A") { int x; cin >> x; sum.push_back(sum.back() ^ x); tr.add(sum.back()); } else { int l, r, x; cin >> l >> r >> x; int res = tr.querymx(l - 1, r, sum.back() ^ x); cout << res << endl; } } } signedmain(){ cin.tie(0); ios::sync_with_stdio(false); int t = 1; //cin >> t; while (t--) solve(); return0; }