Submission #1164450

#TimeUsernameProblemLanguageResultExecution timeMemory
1164450ahmedhali107Klasika (COCI20_klasika)C++20
110 / 110
297 ms151736 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

template<class T, int bits>
struct xortrie {
    vector<array<int, 2>> trie = {{0, 0}}, vals;
    vector<int> mn = {0};

    xortrie() {}

    void insert(T val, int time) {
        int node = 0;
        vals.push_back({val, time});
        for (int i = bits - 1; i >= 0; i--) {
            int j = (val & (1 << i) ? 1 : 0);
            if (trie[node][j] == 0) {
                trie[node][j] = trie.size();
                trie.push_back({0, 0});
                mn.push_back(time);
            }
            node = trie[node][j];
            mn[node] = min(mn[node], time);
        }
    }


    T max(T val, int time) {
        T ans = 0;
        int node = 0;
        for (int i = bits - 1; i >= 0; i--) {
            int j = (val & (1 << i) ? 0 : 1);
            if (trie[node][j] && mn[trie[node][j]] <= time) {
                ans |= (1ll << i);
                node = trie[node][j];
            } else if (mn[trie[node][j ^ 1]] <= time) {
                node = trie[node][j ^ 1];
            } else {
                break;
            }
        }
        return ans;
    }
};

using trie = xortrie<int, 30>;

void solve() {
    int q;
    cin >> q;
    vector<vector<int>> g(1);
    vector<vector<pair<int, int>>> qs(1);
    vector<pair<int, int>> val{{0, 0}};
    for (int i = 1; i <= q; i++) {
        string qt;
        int x, y;
        cin >> qt >> x >> y, x--;
        if (qt[0] == 'A') {
            g[x].push_back(g.size());
            g.emplace_back();
            val.emplace_back(val[x].first ^ y, i);
            qs.emplace_back();
        } else {
            y--;
            qs[y].emplace_back(val[x].first, i);
        }
    }
    vector<int> ans(q + 1, -1);
    auto dfs = [&](auto &&dfs, int u, int p) -> trie {
        trie me;
        me.insert(val[u].first, val[u].second);
        for (int v: g[u]) {
            if (v == p) continue;
            trie child = dfs(dfs, v, u);
            if (child.vals.size() > me.vals.size()) {
                swap(child, me);
            }
            for (auto &[x, t]: child.vals) {
                me.insert(x, t);
            }
        }
        for (auto &[x, t]: qs[u]) {
            ans[t] = me.max(x, t);
        }
        return me;
    };
    auto _ = dfs(dfs, 0, 0);
    for (auto &i: ans) if (~i) cout << i << '\n';
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...