Submission #199907

#TimeUsernameProblemLanguageResultExecution timeMemory
199907mdn2002Klasika (COCI20_klasika)C++14
110 / 110
4578 ms470700 KiB
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; int n,a[200005],k,trie[4000000][3],ans; int en[200005],ot[200005],tmm; vector<int>gr[200005],aq,bq; vector<string>sq; set<int>tim[4000000]; void dfs(int x,int p) { en[x]=++tmm; for(int i=0; i<gr[x].size(); i++) { int u=gr[x][i]; if(u==p)continue; dfs(u,x); } ot[x]=tmm; } string to(long long x) { string s; while(x) { s.push_back('0'+(x%2)); x/=2; } while(s.size()!=30)s.push_back('0'); reverse(s.begin(),s.end()); return s; } void ad(string s,int st) { int nod=0; for(int i=0; i<s.size(); i++) { int x=s[i]-'0'; if(trie[nod][x]==0)trie[nod][x]=++k; nod=trie[nod][x]; tim[nod].insert(st); } } void qu(string s,int z,int x,int st,int fn) { if(s[z]=='1') { int txo=trie[x][0]; int too=1e9; if(tim[txo].lower_bound(st)!=tim[txo].end())too=*tim[txo].lower_bound(st); if(trie[x][0]!=0&&st<=too&&too<=fn) { ans*=2; ans++; qu(s,z+1,trie[x][0],st,fn); return; } else if(trie[x][1]!=0) { ans*=2; qu(s,z+1,trie[x][1],st,fn); } } else { int tx1=trie[x][1]; int to1=1e9; if(tim[tx1].lower_bound(st)!=tim[tx1].end())to1=*tim[tx1].lower_bound(st); if(trie[x][1]!=0&&st<=to1&&to1<=fn) { ans*=2; ans++; qu(s,z+1,trie[x][1],st,fn); } else if(trie[x][0]!=0) { ans*=2; qu(s,z+1,trie[x][0],st,fn); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("gpsduel.in","r",stdin); //freopen("gpsduel.out","w",stdout); cin>>n; int num=1; for(int i=0; i<n; i++) { string s; long long x,y; cin>>s>>x>>y; sq.push_back(s); aq.push_back(x); bq.push_back(y); if(s=="Add") { num++; gr[x].push_back(num); } } dfs(1,0); num=1; string ss=to(0); ad(ss,1); for(int i=0; i<n; i++) { string s=sq[i]; long long x=aq[i],y=bq[i]; if(s=="Add") { num++; a[num]=a[x]^y; string st=to(a[num]); ad(st,en[num]); } else { ans=0; long long b=a[x]; qu(to(b),0,0,en[y],ot[y]); cout<<ans<<endl; } } }

Compilation message (stderr)

klasika.cpp: In function 'void dfs(int, int)':
klasika.cpp:12:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0; i<gr[x].size(); i++)
                  ~^~~~~~~~~~~~~
klasika.cpp: In function 'void ad(std::__cxx11::string, int)':
klasika.cpp:35:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0; i<s.size(); i++)
                  ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...