Submission #211220

#TimeUsernameProblemLanguageResultExecution timeMemory
211220sm1leyKlasika (COCI20_klasika)C++17
110 / 110
3119 ms452128 KiB
#include <vector> #include <set> #include <iostream> #define ll long long #define endl "\n" #define IOS cin.tie(0);cout.tie(0);ios::sync_with_stdio(0); using namespace std; const int N = 2e5+13; struct Query{ int t,x,y; }; struct Node{ set<int> times; Node *bit[2]; Node(){ bit[0]=bit[1]=NULL; } }; Node trie; int timer; int tin[N], tout[N]; int xr[N]; //distance from node 1 to node i vector<pair<int,int>> g[N]; vector<Query> question; void dfs(int v,int p,int val){ tin[v]=++timer; xr[v]=xr[p]^val; for(auto t:g[v]){ if(t.first==p)continue; dfs(t.first,v,t.second); } tout[v]=timer;//++; } void insert(int val,int num){ Node *t = &trie; for(int i=30;i>=-1;i--){ t->times.insert(num); if(val&(1<<i)){ if(t->bit[1]==NULL)t->bit[1]=new Node(); t = t->bit[1]; }else{ if(t->bit[0]==NULL)t->bit[0]=new Node(); t = t->bit[0]; } } } bool can(set<int> &a,int in,int out){ return a.lower_bound(in)==a.upper_bound(out); } // void get(int val,int in,int out){ Node *t = &trie; int ans = 0; for(int i=30;i>=0;i--){ if(val&(1<<i)){//ned 0 if(t->bit[0]==NULL || can(t->bit[0]->times,in,out)){ t = t->bit[1]; }else{ t = t->bit[0]; ans |= (1<<i); } } else{ //ned 1 if(t->bit[1]==NULL||can(t->bit[1]->times,in,out)){ t = t->bit[0]; }else{ ans |= (1<<i); t = t->bit[1]; } } } cout<<ans<<endl; } int q; int main(){ IOS; cin>>q; int num=2; for(int i=0;i<q;i++){ string s;cin>>s; int a,b;cin>>a>>b; if(s=="Add"){ question.push_back({1,num,a}); g[a].push_back({num,b}); g[num].push_back({a,b}); num++; } if(s=="Query")question.push_back({2,a,b}); } dfs(1,1,0); insert(0,tin[1]); for(int i=0;i<q;i++){ int t=question[i].t; int x=question[i].x; int y=question[i].y; if(t==1) insert(xr[x],tin[x]); else get(xr[x],tin[y],tout[y]); } 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...