제출 #1276024

#제출 시각아이디문제언어결과실행 시간메모리
1276024papauloKlasika (COCI20_klasika)C++20
33 / 110
1743 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;

#define MAXQ 200200
int id[MAXQ];
vector<int> chi[MAXQ];
int t=1;
int val[MAXQ];
unordered_map<int, int> mp[MAXQ][32];
vector<pair<int, pair<int, int>>> qs[MAXQ];
int ans[MAXQ];
int sz[MAXQ];

int search(int t, int v, int tmp) {
    int n=0;
    int ans=0;
    for(int i=31;i>=0;i--) {
        int m=1<<i;
        int c=v&m;
        int nxt=n|(c^m);
        auto p = mp[t][i].find(nxt);
        if(p!=mp[t][i].end()&&p->second<=tmp) {
            ans|=1<<i;
        } else nxt=n|c;
        n=nxt;
    }
    return ans;
}

void dfs1(int v) {
    sz[v]=1;
    for(auto u : chi[v]) {
        dfs1(u);
        sz[v]+=sz[u];
    }
}

void dfs2(int v) {
    int bst=0;
    for(auto u : chi[v]) {
        if(sz[u]>sz[bst]) bst=u;
    }
    if(!bst) {
        id[v]=v;
    } else {
        dfs2(bst);
        id[v]=id[bst];
    }
    for(auto u : chi[v]) {
        if(u==bst) continue;
        dfs2(u);
        for(int i=0;i<32;i++) {
            for(auto pr : mp[id[u]][i]) {
                auto p = mp[id[v]][i].find(pr.first);
                if(p==mp[id[v]][i].end()) mp[id[v]][i].insert(pr);
                else p->second=min(p->second, pr.second);
            }
            mp[id[u]][i].clear();
        }
    }
    int n=0;
    for(int i=31;i>=0;i--) {
        n|=(val[v]&(1<<i));
        mp[id[v]][i][n]=v;
    }
    for(auto pr : qs[v]) {
        int i=pr.first, vl=pr.second.first, t=pr.second.second;
        ans[i]=search(id[v], vl, t);
    }
}

int main() {
    memset(ans, 0xff, sizeof(ans));
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    val[1]=0;
    int q;
    cin >> q;
    for(int i=0;i<q;i++) {
        string op;
        cin >> op;
        if(op=="Add") {
            int x, y;
            cin >> x >> y;
            ++t;
            chi[x].push_back(t);
            val[t]=val[x]^y;
        } else {
            int a, b;
            cin >> a >> b;
            qs[b].push_back({i, {val[a], t}});
        }
    }
    sz[0]=0;
    dfs1(1);
    dfs2(1);
    for(int i=0;i<q;i++) {
        int a=ans[i];
        if(a>=0) cout << a << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...