제출 #1162379

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

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

using namespace std;
using ll = long long;

const char nl = '\n';

struct segTree {
    int N;
    vector<set<int>> sg;

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

    int get_max(const set<int> &st, int x) {
        if (st.empty()) return 0;
        const int B = 30;
        int cur = 0, mx = (1 << B) - 1;
        for (int i = B; ~i; i--) {
            int bit = !(x >> i & 1);
            if (bit) {
                int ncur = cur | (1 << i);
                auto mnit = st.lower_bound(ncur);
                auto mxit = st.upper_bound(mx);
                if (mnit != st.end() && mxit != st.begin() && *mnit <= *prev(mxit)) {
                    cur = ncur;
                } else {
                    mx &= ~(1 << i);
                }
            } else {
                int nmx = mx & ~(1 << i);
                auto mnit = st.lower_bound(cur);
                auto mxit = st.upper_bound(nmx);
                if (mnit != st.end() && mxit != st.begin() && *mnit <= *prev(mxit)) {
                    mx = nmx;
                } else {
                    cur |= 1 << i;
                }
            }
        }
        return x ^ cur;
    }

    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, get_max(sg[l++], x));
            if (r % 2 == 0) ans = max(ans, get_max(sg[r--], 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);
// #ifndef ONLINE_JUDGE
//     freopen("../in.txt", "r", stdin);
//     freopen("../out.txt", "w", stdout);
// #endif
    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...