Submission #965504

#TimeUsernameProblemLanguageResultExecution timeMemory
965504noyancanturkKlasika (COCI20_klasika)C++17
33 / 110
780 ms524288 KiB
#include "bits/stdc++.h"
using namespace std;
    
#define int int64_t
#define pb push_back
    
const int lim=2e5+100;
const int mod=1e9+7;
 
using pii=pair<int,int>;

int ans;

vector<bool>lasn;

struct trie{

    struct node{
        node*c[2]{0,0};
    };

    using pnode=node*;
    pnode root;

    trie(){root=new node();}

    void insert(int x){
        pnode cur=root;
        for(int i=29;0<=i;i--){
            if(!cur->c[(x>>i)&1]){
                cur->c[(x>>i)&1]=new node();
            }
            cur=cur->c[(x>>i)&1];
        }
    }

    int search(int x){
        pnode cur=root;
        int ans=0;
        for(int i=29;0<=i;i--){
            if(cur->c[!((x>>i)&1)]){
                if(!((x>>i)&1))ans+=1<<i;
                cur=cur->c[!((x>>i)&1)];
            }else if(cur->c[(x>>i)&1]){
                if((x>>i)&1)ans+=1<<i;
                cur=cur->c[(x>>i)&1];
            }else{
                return 0;
            }
        }
        return ans^x;
    }

};

struct segtree{
    trie tree[4*lim];
    int n;
    segtree(int n):n(n){}
    int P,VAL;
    void update(int l,int r,int node){
        tree[node].insert(VAL);
        if(l==r)return;
        int mid=(l+r)>>1,child=node<<1;
        if(P<=mid)update(l,mid,child);
        else update(mid+1,r,child|1);
    }
    void update(int p,int val){
        P=p,VAL=val;
        update(0,n,1);
    }
    int L,R,X;
    int query(int l,int r,int node){
        if(L<=l&&r<=R){
            return tree[node].search(X);
        }
        if(r<L||R<l){
            return 0;
        }
        int mid=(l+r)>>1,child=node<<1;
        return max(query(l,mid,child),query(mid+1,r,child|1));
    }
    int find(int l,int r,int x){
        L=l,R=r,X=x;
        return query(0,n,1);
    }
}*st;

struct qdata{
    int ty,x,y;
};

vector<pii>v[lim];
int dist[lim];
int tin[lim],tout[lim],tt=0;

void dfs(int node){
    tin[node]=tt++;
    for(auto[j,c]:v[node]){
        dist[j]=dist[node]^c;
        dfs(j);
    }
    tout[node]=tt-1;
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#ifdef Local  
    freopen(".in","r",stdin); freopen(".out","w",stdout);
#endif
    int n;
    cin>>n;
    qdata q[n];
    int curnode=2;
    for(int i=0;i<n;i++){
        string ty;
        cin>>ty>>q[i].x>>q[i].y;
        if(ty=="Add"){
            q[i].ty=0;
            v[q[i].x].pb({curnode,q[i].y});
            curnode++;
        }else{
            q[i].ty=1;
        }
    }
    dfs(1);
    st=new segtree(n);
    st->update(tin[1],0);
    curnode=2;
    for(int i=0;i<n;i++){
        if(!q[i].ty){
            st->update(tin[curnode],dist[curnode]);
            curnode++;
        }else{
            cout<<st->find(tin[q[i].y],tout[q[i].y],dist[q[i].x])<<"\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...