제출 #1348150

#제출 시각아이디문제언어결과실행 시간메모리
1348150BehruzbekXKlasika (COCI20_klasika)C++20
0 / 110
624 ms546044 KiB
#include <bits/stdc++.h>

using namespace std;

constexpr int N = 2'00'000;

struct trie{
    trie* a[2];
    trie () { a[0] = a[1] = nullptr; }
    void add (int x) {
        trie* root = this;
        for (int i = 30; i >= 0; --i) {
            int bit = (x >> i) & 1;
            if (!root->a[bit]) root->a[bit] = new trie();
            root = root->a[bit];
        }
    }
    int get (int x) {
        int ans = 0;
        trie* root = this;
        for (int i = 30; i >= 0; --i) {
            int bit = (x >> i) & 1;
            if (root->a[bit ^ 1]) root = root->a[bit ^ 1], ans |= 1 << i;
            else if (root->a[bit]) root = root->a[bit];
        }
        return ans;
    }
};
trie t[N << 2];
int q, tin[N], tout[N], d[N], rt = 0, tim = 0;
vector<int> a[N];
vector<tuple<int, int, int>> Q;
void upd (int i, int l, int r, int id, int x){
    t[i].add(x);
    if (l == r) return;
    int m = (l + r) >> 1;
    if (id <= m) upd(i << 1, l, m, id, x);
    else upd(i << 1 | 1, m + 1, r, id, x);
}
int get (int i, int l, int r, int L, int R, int x) {
    if (l > R || r < L) return 0ll;
    if (L <= l && r <= R) return t[i].get(x);
    int m = (l + r) >> 1;
    return max(get(i << 1, l, m, L, R, x), get(i << 1 | 1, m + 1, r, L, R, x));
}
void upd (int i, int x) { upd(1, 0, N - 1, i, x); }
int get (int l, int r, int x) { return get(1, 0, N - 1, l, r, x); }
void dfs (int v) {
    tin[v] = tim++;
    for (int u : a[v]) {
        dfs(u);
    }
    tout[v] = tim - 1;
}
int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> q;
    while (q--) {
        string s;
        cin >> s;
        int x, y;
        if (s == "Add") {
            cin >> x >> y, --x;
            ++rt;
            a[x].emplace_back(rt);
            d[rt] = d[x] ^ y;
            Q.emplace_back(0, x, y);
        }
        else {
            cin >> x >> y, --x, --y;
            Q.emplace_back(1, x, y);
        }
    }
    dfs(0);
    rt = 0;
    for (auto [typ, x, y] : Q) {
        if (typ) {
            cout << get(tin[y], tout[y], d[x]) << '\n';
        }
        else {
            ++rt;
            upd(tin[rt], d[rt]);
        }
    }
    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...