任意区间中寻找某个值,使其异或x最大化。

// 非递归版
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 600010, len = 23;
int n, m, s[N];
int ch[N * 25][2], ver[N * 25];
int root[N], idx;

void insert(int x, int y, int i) {
    ver[x] = i;
    for (int k = len; k >= 0; k--) {
        int c = s[i] >> k & 1;
        ch[x][!c] = ch[y][!c]; // 非新节点指向旧版本
        ch[x][c] = ++idx; // 新节点开点
        y = ch[y][c];
        x = ch[x][c];
        ver[x] = i;
    }
}
int query(int x, int L, int v) {
    int res = 0;
    for (int k = len; k >= 0; k--) {
        int c = v >> k & 1;
        if (ver[ch[x][!c]] >= L)
            x = ch[x][!c], res += 1 << k;
        else
            x = ch[x][c];
    }
    return res;
}
int main() {
    int l, r, x, ans;
    char op;
    scanf("%d%d", &n, &m);
    ver[0] = -1;
    root[0] = ++idx;
    insert(root[0], 0, 0);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &x);
        root[i] = ++idx;
        s[i] = s[i - 1] ^ x;
        insert(root[i], root[i - 1], i);
    }
    while (m--) {
        scanf(" %c", &op);
        if (op == 'A') {
            scanf("%d", &x);
            root[++n] = ++idx;
            s[n] = s[n - 1] ^ x;
            insert(root[n], root[n - 1], n);
        } else {
            scanf("%d%d%d", &l, &r, &x);
            ans = query(root[r - 1], l - 1, s[n] ^ x);
            printf("%d\\n", ans);
        }
    }
    return 0;
}