Submission #1348976

#TimeUsernameProblemLanguageResultExecution timeMemory
1348976po_rag526Klasika (COCI20_klasika)C++20
110 / 110
324 ms141532 KiB
// Author : AhmedQassem_
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;

#define endl '\n'
#define ep cout << fixed << setprecision(12)
#define all(x) (x).begin(), (x).end()
#define allr(x) (x).rbegin(), (x).rend()

const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const ld PI = acosl(-1.0L);
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};

int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }

void fastio() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
}

const int N = 2e5+5;

struct BinaryTrie {
    static const int MAX_BIT = 30;

    struct Node {
        int nxt[2];
        int min_id;
        Node() { nxt[0] = nxt[1] = 0; min_id = INF; }
    };

    vector<Node> tr;
    BinaryTrie() { tr.push_back(Node()); }

    int add_node() { tr.push_back(Node()); return (int)tr.size() - 1; }

    void insert(int x, int id) {
        int u = 0;
        tr[u].min_id = min(tr[u].min_id, id);
        for(int i = MAX_BIT; i >= 0; --i) {
            int b = (x >> i) & 1;
            if(!tr[u].nxt[b]) tr[u].nxt[b] = add_node();
            u = tr[u].nxt[b];
            tr[u].min_id = min(tr[u].min_id, id);
        }
    }

    int max_xor(int x, int limit) {
        if(tr[0].min_id > limit) return 0;
        int u = 0;
        int res = 0;
        for(int i = MAX_BIT; i >= 0; --i) {
            int b = (x >> i) & 1;
            int w = b ^ 1;
            if(tr[u].nxt[w] && tr[tr[u].nxt[w]].min_id <= limit) {
                res |= (1 << i);
                u = tr[u].nxt[w];
            } else if(tr[u].nxt[b] && tr[tr[u].nxt[b]].min_id <= limit) {
                u = tr[u].nxt[b];
            } else {
                break;
            }
        }
        return res;
    }
};

vector<int> adj[N];
vector<int> sub[N];
BinaryTrie bt[N];
int d[N];
vector<array<int,3>> qs[N];
int ans[N];

void dfs(int u) {
    sub[u].push_back(u);
    bt[u].insert(d[u], u);
    for(int v : adj[u]) {
        dfs(v);
        if(sub[u].size() < sub[v].size()) {
            swap(sub[u], sub[v]);
            swap(bt[u].tr, bt[v].tr);
        }
        for(int x : sub[v]) {
            sub[u].push_back(x);
            bt[u].insert(d[x], x);
        }
        sub[v].clear();
        sub[v].shrink_to_fit();
        bt[v].tr.clear();
        bt[v].tr.shrink_to_fit();
    }
    for(auto& q : qs[u]) {
        int a = q[0], limit = q[1], idx = q[2];
        ans[idx] = bt[u].max_xor(d[a], limit);
    }
}

void Magek() {
    int q; cin >> q;
    int n = 1;
    d[1] = 0;
    int q_cnt = 0;
    for(int i = 0; i < q; i++) {
        string s; cin >> s;
        if(s == "Add") {
            int u, w; cin >> u >> w;
            n++;
            adj[u].push_back(n);
            d[n] = d[u] ^ w;
        } else {
            int a, b; cin >> a >> b;
            qs[b].push_back({a, n, q_cnt++});
        }
    }
    dfs(1);
    for(int i = 0; i < q_cnt; i++) {
        cout << ans[i] << endl;
    }
}

int32_t main() {
    fastio();
    int t = 1;
    while (t--) Magek();
    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...