Submission #1350924

#TimeUsernameProblemLanguageResultExecution timeMemory
1350924warrennKlasika (COCI20_klasika)C++20
33 / 110
542 ms589824 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};

    void insert(int val,int ke){
        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);
    }

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

        //cout<<val<<" "<<ke<<" "<<bit<<endl;
        if(ch[bit^1]){
            return (1<<ke)+ch[bit^1]->mx(val,ke-1);
        }
        else{
            if(!ch[bit])return 0;
            return ch[bit]->mx(val,ke-1);
        }
    }
};

struct seg{
    int l,r;
    seg *lf=0,*rg=0;
    trie skrg;

    seg(int x,int y){
        l=x,r=y;
    }

    void upd(int idx,int val){
        skrg.insert(val,29);
        if(l==r)return;
        int mid=(l+r)/2;
        if(mid>=idx){
            if(!lf)lf=new seg(l,mid);
            lf->upd(idx,val);
        }
        else{
            if(!rg)rg=new seg(mid+1,r);
            rg->upd(idx,val);
        }
    }

    int query(int posl,int posr,int val){
        if(l>posr || r<posl)return 0;
        if(l>=posl && r<=posr)return skrg.mx(val,29);

        int apa=0;
        if(lf)apa=max(apa,lf->query(posl,posr,val));
        if(rg)apa=max(apa,rg->query(posl,posr,val));
        return apa;
    }
};


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);
    seg apa(1,n);
    
    apa.upd(1,0);
    int tmp=1;
    for(auto [ty,a,b] : slv){
        if(ty==0){
            tmp++;
           // cout<<in[tmp]<<"k"<<endl;
            apa.upd(in[tmp],pref[tmp]);
        }
        else{
          //  cout<<in[b]<<' '<<out[b]<<" "<<pref[a]<<endl;
            cout<<apa.query(in[b],out[b],pref[a])<<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...