Submission #1327182

#TimeUsernameProblemLanguageResultExecution timeMemory
1327182NHristovKlasika (COCI20_klasika)C++20
110 / 110
224 ms59816 KiB
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

const int N=2e5+5;
int t, tim[N], ans[N], tin[N], tout[N], tour[N], ti, sz[N], pf[N], hvy[N];
vector<pair<int, int>> g[N];
vector<tuple<int, int, int>> que[N];

struct trie {
    int sz=0, c[2][30*N], mn[30*N];
    void upd(int x, int y) {
        int curr=0;
        for(int i=29; i>=0; i--) {
            int b=(x>>i&1);
            if(!c[b][curr]) {
                c[b][curr]=++sz;
                mn[sz]=y;
            }
            curr=c[b][curr];
            mn[curr]=min(mn[curr], y);
        }
    }
    int qry(int x, int y) {
        int ans=0, curr=0;
        for(int i=29; i>=0; i--) {
            int b=(x>>i&1);
            if(c[b^1][curr]&&mn[c[b^1][curr]]<=y) {
                ans+=(1<<i);
                curr=c[b^1][curr];
            }
            else
                curr=c[b][curr];
        }
        return ans;
    }
} trie;

void dfs1(int u) {
    tin[u]=++ti;
    tour[ti]=u;
    sz[u]=1;
    for(auto [v, w] : g[u]) {
        pf[v]=pf[u]^w;
        dfs1(v);
        sz[u]+=sz[v];
        if(hvy[u]==0||sz[hvy[u]]<sz[v])
            hvy[u]=v;
    }
    tout[u]=ti;
    ///cout << "debug: " << u << " " << tin[u] << " " << tout[u] << endl;
}

void dfs2(int u, bool f) {
    for(auto [v, w] : g[u]) {
        if(v!=hvy[u])
            dfs2(v, 0);
    }
    if(hvy[u])
        dfs2(hvy[u], 1);
    trie.upd(pf[u], tim[u]);
    for(auto [v, w] : g[u])
        if(v!=hvy[u])
            for(int i=tin[v]; i<=tout[v]; i++)
                trie.upd(pf[tour[i]], tim[tour[i]]);
    for(auto [v, when, id] : que[u])
        ans[id]=trie.qry(pf[v], when);
    que[u].clear();
    if(!f) {
        for(int i=0; i<=trie.sz; i++)
            trie.c[0][i]=trie.c[1][i]=0;
        trie.sz=0;
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> t;
    int curr=1, ask=0;
    for(int i=1; i<=t; i++) {
        string s;
        int u, v;
        cin >> s >> u >> v;
        if(s=="Add") {
            g[u].push_back({++curr, v});
            tim[curr]=i;
        }
        else
            que[v].push_back({u, i, ++ask});
    }
    dfs1(1);
    dfs2(1, 0);
    for(int i=1; i<=ask; i++)
        cout << ans[i] << endl;

    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...