Submission #1125173

#TimeUsernameProblemLanguageResultExecution timeMemory
1125173Zero_OPKlasika (COCI20_klasika)C++20
0 / 110
43 ms8684 KiB
//expected memory : ~ 183 mb
#include <bits/stdc++.h>

using namespace std;

struct Trie{
    struct node{
        int next[2];
        set<int> st;

        node() : st() {
            next[0] = next[1] = -1;
        }

        bool check(int l, int r){
            return st.upper_bound(r) != st.lower_bound(l);
        }
    };

    vector<node> nodes;

    Trie() : nodes() {
        nodes.emplace_back(node());
    }

    void insert(int x, int id){
        int u = 0;
        for(int i = 29; i >= 0; --i){
            bool t = (x >> i & 1);
            if(nodes[u].next[t] == -1){
                nodes[u].next[t] = (int)nodes.size();
                nodes.emplace_back(node());
            }

            u = nodes[u].next[t];
            nodes[u].st.insert(id);
        }
    }

    int max_xor(int x, int l, int r){
        int ans = 0, u = 0;
        for(int i = 29; i >= 0; --i){
            int t = (x >> i & 1);
            if((nodes[u].next[t ^ 1] != -1) && (nodes[nodes[u].next[t ^ 1]].check(l, r))){
                ans |= (1 << i);
                u = nodes[u].next[t ^ 1];
            } else{
                assert(nodes[u].next[t] != -1);
                u = nodes[u].next[t];
            }
        }
        return ans;
    }
};

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

    int Q;
    cin >> Q;

    int N = 1;

    vector<vector<pair<int, int>>> adj;
    adj.emplace_back();

    vector<tuple<int, int, int>> queries;
    for(int i = 0; i < Q; ++i){
        string t;
        int u, v;
        cin >> t >> u >> v;
        if(t[0] == 'A'){
            --u;
            adj.emplace_back();
            adj[u].emplace_back(N++, v);
            queries.emplace_back(0, N - 1, -1);
        } else{
            --u, --v;
            queries.emplace_back(1, u, v);
        }
    }

    int timer_dfs = 0;
    vector<int> vl(N), tin(N), tout(N);

    function<void(int)> dfs = [&](int u){
        tin[u] = ++timer_dfs;
        for(auto [v, w] : adj[u]){
            vl[v] = vl[u] ^ w;
            dfs(v);
        }
        tout[u] = timer_dfs;
    };

    dfs(0);
    Trie tr;

    for(auto [type, u, v] : queries){
        if(type == 0){
            tr.insert(vl[u], tin[u]);
        } else{
            cout << tr.max_xor(vl[u], tin[v], tout[v]) << '\n';
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...