제출 #1350928

#제출 시각아이디문제언어결과실행 시간메모리
1350928warrennKlasika (COCI20_klasika)C++20
110 / 110
1473 ms427688 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair<int,int>
#define fir first
#define sec second

const int maxn=2e5;
vector<ii>adj[maxn+2];
int in[maxn+2],out[maxn+2],conv[maxn+2];
int pref[maxn+2];
int cnt;

struct trie{
    trie *ch[2]={NULL};
    set<int>st;

    void insert(int val,int ke,int idx){
        st.insert(in[idx]);
        if(ke==-1)return;
        int bit=0;
        if((val>>ke)&1)bit=1;
      //  cout<<val<<' '<<ke<<' '<<bit<<endl;
        if(!ch[bit])ch[bit]=new trie();
        ch[bit]->insert(val,ke-1,idx);
    }

    int mx(int val,int ke,int idx){
        if(ke==-1)return 0;
        int bit=0;
        if((val>>ke)&1)bit=1;

        //cout<<val<<" "<<ke<<" "<<bit<<endl;
        if(ch[bit^1]){
            auto it=ch[bit^1]->st.lower_bound(in[idx]);

            if(it!=ch[bit^1]->st.end() && *it<=out[idx])return (1<<ke)+ch[bit^1]->mx(val,ke-1,idx);
        }
        
      //  cout<<val<<' '<<ke<<' '<<bit<<' '<<idx<<endl;
        if(!ch[bit])return 0;
        auto it=ch[bit]->st.lower_bound(in[idx]);
        if(it!=ch[bit]->st.end() && *it<=out[idx])return ch[bit]->mx(val,ke-1,idx);

        return 0;
    }
};


void dfs(int cur){
    in[cur]=++cnt; conv[cnt]=cur;
    for(auto x : adj[cur]){
        pref[x.fir]=(pref[cur]^x.sec);
        dfs(x.fir);
    }
    out[cur]=cnt;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int qu; cin>>qu;
    int n=1;
    vector<array<int,3> >slv;

    for(int q=1;q<=qu;q++){
        string s; cin>>s;
        int a,b;
        cin>>a>>b;

        if(s=="Add"){
            n++;
            adj[a].push_back({n,b});
            slv.push_back({0,a,b});
        }
        else{
            slv.push_back({1,a,b});
        }
    }
    dfs(1);
    trie apa;
    
    apa.insert(0,29,1);
    int tmp=1;
    for(auto [ty,a,b] : slv){
        if(ty==0){
            tmp++;
           // cout<<in[tmp]<<"k"<<endl;
            apa.insert(pref[tmp],29,tmp);
        }
        else{
          //  cout<<in[b]<<' '<<out[b]<<" "<<pref[a]<<endl;
            cout<<apa.mx(pref[a],29,b)<<endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...