Submission #1263658

#TimeUsernameProblemLanguageResultExecution timeMemory
1263658anarch_yKlasika (COCI20_klasika)C++20
0 / 110
2772 ms225920 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) begin(x), end(x)
#define sz(x) (int)x.size()
#define pb push_back

struct Trie{
    vector<vector<int>> trie;
    int num;

    void init(){
        trie.resize(1e5+1, vector<int>(2));
        num = 0;
    }
 
    void insert(int x){
        int cur = 0;
        for(int i=30; i>=0; i--){
            bool c = x & (1<<i);
            if(trie[cur][c] == 0){
                trie[cur][c] = ++num;
            }
            cur = trie[cur][c];
        }
    }
 
    int max_xor(int x){
        int cur = 0;
        int res = 0;
        for(int i=30; i>=0; i--){
            bool c = x & (1<<i);
            if(trie[cur][1-c]){
                res += (1<<i);
                cur = trie[cur][1-c];
            }
            else{
                cur = trie[cur][c];
            }
        }
        return res;
    }
};

const int maxn = 200001;
vector<int> adj[maxn];
int B[maxn], sub[maxn], id[maxn];
vector<int> tour;

void dfs(int s, int p){
    sub[s] = 1;
    tour.pb(s);
    for(auto u: adj[s]){
        if(u == p) continue;
        dfs(u, s);
        sub[s] += sub[u];
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int q; cin >> q;
    int n = 1;
    vector<vector<int>> qry;
    while(q--){
        string s; cin >> s;
        if(s == "Add"){
            int x, y; cin >> x >> y;
            n++;
            adj[x].pb(n); adj[n].pb(x);
            B[n] = (B[x]^y);
            qry.pb({0, n});
        }
        else{
            int a, b; cin >> a >> b;
            qry.pb({1, a, b});
        }
    }
    dfs(1, 0);
    vector<int> A(n);
    for(int i=0; i<n; i++){
        id[tour[i]] = i;
        A[i] = B[tour[i]];
    }
    int k = (int)sqrt(30*n);
    int m = (n-1)/k;
    Trie T[m+1];
    for(int i=0; i<=m; i++){
        T[i].init();
    }
    vector<int> v(n, -1);
    auto query = [&](int l, int r, int z){
        int x = l/k, y = r/k;
        int ans = 0;
        if(x+1 <= y-1){
            for(int i=x+1; i<=y-1; i++){
                if(T[i].num != 0){
                    ans = max(ans, T[i].max_xor(z));
                }
            }
            for(int i=l; i<(x+1)*k; i++){
                if(v[i] != -1){
                    ans = max(ans, (z^v[i]));
                }
            }
            for(int i=y*k; i<=r; i++){
                if(v[i] != -1){
                    ans = max(ans, (z^v[i]));
                }
            }
        }
        else{
            for(int i=l; i<=r; i++){
                if(v[i] != -1){
                    ans = max(ans, (z^v[i]));
                }
            }
        }
        return ans;
    };
    for(auto w: qry){
        if(w[0] == 0){
            int x = w[1];
            v[id[x]] = A[id[x]];
            int i = id[x]/k;
            T[i].insert(A[id[x]]);
        }
        else{
            int a = w[1], b = w[2];
            int ans = query(id[b], id[b]+sub[b]-1, B[a]);
            cout << ans << "\n";
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...