O(α(n)) 01Trie 求助...
查看原帖
O(α(n)) 01Trie 求助...
516831
Leo_LeLe楼主2023/4/30 21:57
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f3f3f3f3f
#define clz __builtin_clz
#define lg(x) (31 - clz(x))
using namespace std;
const int maxn = 5e5+10,lim = lg(maxn)+1;
int n,m,l,r,x; char opt;
struct node{ int s[2],lst; }t[maxn];
int cnt,rt[maxn],a[maxn];
inline void insert(int &u,int x,int ver) {
    for(int i = lim-1;~i;--i) {
        t[++cnt] = t[*u], *u = cnt;
        t[*u].lst = ver;
        const int c = x >> i & 1;
        u = t[*u].s+c;
    }
    t[++cnt] = t[*u], *u = cnt;
    t[*u].lst = ver;
}
int get(int u,int x,int l) {
    int ans = 0;
    for(int i = lim-1;~i;--i) {
        ans<<=1;
        const int c = x >> i & 1;
        if(t[u].s[!c][t].lst >= l) u = t[u].s[!c], ans |= 1;
        else u = t[u].s[c];
    } return ans;
}
signed main() {
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m;
    for(int i = 1;i<=n;++i) {
        cin>>a[i];
        a[i] ^= a[i-1];
        insert(rt[i] = rt[i-1],a[i],i);
    }
    while(m--) {
        cin>>opt;
        if(opt == 'A') {
            cin>>x;
            a[++n] = x;
            a[n] ^= a[n-1];
            insert((rt[n] = rt[n-1]),a[n],n);
        } else {
            cin>>l>>r>>x;
            cout<<get(rt[r-1],a[n]^x,l-1)<<'\n';
        }
    }
}
2023/4/30 21:57
加载中...