제출 #1161885

#제출 시각아이디문제언어결과실행 시간메모리
1161885ahmedhali107Klasika (COCI20_klasika)C++20
33 / 110
810 ms589824 KiB
#include <bits/stdc++.h>

#define all(x) begin(x), end(x)

using namespace std;
using ll = long long;

const char nl = '\n';

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

    xortrie() {}

    void update(T val, int delta) {
        int node = 0;
        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});
            }
            node = trie[node][j];
        }
    }

    void insert(T val) {
        update(val, 1);
    }

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

struct segTree {
    int N;
    vector<xortrie<int, 30>> sg;

    segTree(int n) {
        N = 1;
        while (N < n) N <<= 1;
        sg.assign(N << 1, {});
    }

    void update(int i, int x) {
        for (i += N; i; i >>= 1) {
            sg[i].insert(x);
        }
    }

    int query(int l, int r, int x) {
        int ans = 0;
        for (l += N, r += N; l <= r; l >>= 1, r >>= 1) {
            if (l % 2 == 1) ans = max(ans, sg[l++].max(x));
            if (r % 2 == 0) ans = max(ans, sg[r--].max(x));
        }
        return ans;
    }
};

void solve() {
    int n;
    cin >> n;
    vector<vector<int>> g(1);
    vector<int> a(1);
    vector<array<int, 3>> qs(n);
    for (int i = 0; i < n; i++) {
        string t;
        cin >> t;
        if (t == "Add") {
            int u, x;
            cin >> u >> x, --u;
            g[u].push_back(g.size());
            a.push_back(a[u] ^ x);
            qs[i] = {1, (int) g.size(), 0};
            g.emplace_back();
        } else {
            int u, v;
            cin >> u >> v, --u, --v;
            qs[i] = {2, u, v};
        }
    }
    int timer = -1;
    vector<int> tin(n), tout(n);
    auto dfs = [&](auto &&dfs, int u) -> void {
        tin[u] = ++timer;
        for (int v: g[u]) dfs(dfs, v);
        tout[u] = timer;
    };
    dfs(dfs, 0);
    segTree sg(n);
    sg.update(0, 0);
    for (auto &[t, u, v]: qs) {
        if (t == 1) {
            sg.update(tin[u], a[u]);
        } else {
            cout << sg.query(tin[v], tout[v], a[u]) << nl;
        }
    }
}

signed main() {
    ios_base::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...