Submission #1117361

#TimeUsernameProblemLanguageResultExecution timeMemory
1117361Tai_xiuKlasika (COCI20_klasika)C++14
110 / 110
1699 ms51016 KiB
#include<bits/stdc++.h> using namespace std; #define i128 int128 #define ii pair<int,int> #define ld long double #define vi vector<int> #define vvi vector<vi> #define vii vector<pair<int,int>> #define FOR(i,a,b) for (int i=a;i<=b;i++) #define FOR1(i,a,b,c) for (int i=a;i<=b;i+=c) #define REP(i,a,b) for (int i=a;i>=b;i--) #define REP1(i,a,b,c) for(int i=b;i>=a;i-=c) #define endh '\n'; #define len(a) a.length() #define pb(c) push_back(c) #define elif else if #define ppb() pop_back() #define rong std::npos #define all(c) (c.begin(),c.end()) #define Z int #define R double #define lcm(a,b) ((int) (a/__gcd(a,b))*b) #define mk(a,b) make_pair(a,b) Z dx4[]={-1,1,0,0}; Z dy4[]={0,0,1,-1}; string co="YES",khong="NO"; const int mod=1e9+7; const Z maxn=200005; const Z blocksize=2024; Z tour[maxn],tin[maxn],tout[maxn],s[maxn],id=0,cnode=1,nv[maxn],check[maxn]; Z q; vi g[maxn]; struct item { Z type,x,y; item(){} item(Z _type,Z _x,Z _y) { type=_type; x=_x; y=_y; } }Q[maxn]; Z tt[maxn*64][2]; struct trie { Z root; void update(Z val) { Z curr=root; REP(i,30,0){ if (val>>i&1){ if (tt[curr][1]==0){ tt[curr][1]= ++cnode; } curr=tt[curr][1]; } else{ if (tt[curr][0]==0){ tt[curr][0]= ++cnode; } curr=tt[curr][0]; } } } Z query (Z val) { Z curr=root; Z ans=0; REP(i,30,0){ Z tam=(val>>i&1); if (tt[curr][tam^1]!=0){ ans+=(1<<i); curr=tt[curr][tam^1]; } else if ( tt[curr][tam]!=0){ curr=tt[curr][tam]; } else return ans; } return ans; } }st[maxn]; void dfs(Z u) { tour[++id]=u; tin[u]=id; for (Z v:g[u]){ dfs(v); } tout[u]=id; } void update(Z pos,Z val) { nv[pos]=val; check[pos]=1; st[pos/blocksize].update(val); } Z query(Z l,Z r,Z val) { Z ans=0; Z taml=l/blocksize,tamr=r/blocksize; if (l/blocksize==r/blocksize){ FOR(i,l,r){ if (check[i]) ans=max(ans,nv[i]^val); } return ans; } FOR(i,l,r){ if (i%blocksize==0){ taml=i/blocksize; break; } if (check[i]) ans=max(ans,nv[i]^val); } REP(i,r,l){ if (check[i]) ans=max(ans,nv[i]^val); if (i%blocksize==0){ tamr=(i-1)/blocksize; break; } } FOR(i,taml,tamr){ ans=max(ans,st[i].query(val)); } return ans; } void solve() { cin>>q; Z cnt=1; FOR(i,1,q) { string aa; Z x,y,type; cin>>aa>>x>>y; if (aa[0]=='A') type=1; else type=2; if (type==1) { cnt++; g[x].pb(cnt); s[cnt]=(s[x]^y); Q[i]=item(1,cnt,0); } else{ Q[i]=item(2,x,y); } } dfs(1); cnode=cnt/blocksize+1; FOR(i,1,cnt/blocksize+1) st[i].root=i; update(1,s[1]); FOR(i,1,q){ if (Q[i].type==1){ update(tin[Q[i].x],s[Q[i].x]); } else{ Z tam=s[Q[i].x]; cout<<query(tin[Q[i].y],tout[Q[i].y],tam)<<'\n'; } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); Z t=1; // cin>>t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...