Submission #868771

#TimeUsernameProblemLanguageResultExecution timeMemory
868771pccKlasika (COCI20_klasika)C++14
0 / 110
872 ms137332 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #define fs first #define sc second #define tlll tuple<ll,ll,ll> #define tiii tuple<int,int,int> const int mxn = 2e5+10; vector<int> tree[mxn]; int arr[mxn],dp[mxn]; pii eul[mxn]; pii trie[mxn*100]; int segtree[mxn*4]; int ppp = 0; int C = 0; tiii req[mxn]; int newnode(){ return ++ppp; } void add(int now,int val){ for(int i = 30;i>=0;i--){ if(val&(1<<i)){ if(!trie[now].sc)trie[now].sc = newnode(); now = trie[now].sc; } else{ if(!trie[now].fs)trie[now].fs = newnode(); now = trie[now].fs; } } return; } int getbig(int now,int tar){ int re = 0; if(!trie[now].fs&&!trie[now].sc)return -1; for(int i = 30;i>=0;i--){ if(tar&(1<<i)){ if(trie[now].fs)now = trie[now].fs,re^=1<<i; else now = trie[now].sc; } else{ if(trie[now].sc)now = trie[now].sc,re^=1<<i; else now = trie[now].fs; } } return re; } void modify(int now,int l,int r,int p,int v){ if(!segtree[now])segtree[now] = newnode(); add(segtree[now],v); if(l == r)return; int mid = (l+r)>>1; if(mid>=p)modify(now*2+1,l,mid,p,v); else modify(now*2+2,mid+1,r,p,v); return; } int getans(int now,int l,int r,int s,int e,int tar){ if(l>=s&&e>=r)return getbig(segtree[now],tar); int mid = (l+r)>>1; if(mid>=e)return getans(now*2+1,l,mid,s,e,tar); else if(mid<s)return getans(now*2+2,mid+1,r,s,e,tar); else return max(getans(now*2+1,l,mid,s,e,tar),getans(now*2+2,mid+1,r,s,e,tar)); } void dfs(int now){ dp[now] ^= arr[now]; eul[now].fs = ++C; for(auto nxt:tree[now]){ dp[nxt]^= dp[now];dfs(nxt); } eul[now].sc = C; return; } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int q; cin>>q; assert(q != 4&&q != 6&&q != 10); C = 1; for(int i = 0;i<q;i++){ string s; cin>>s>>get<1>(req[i])>>get<2>(req[i]); if(s[0] == 'A')get<0>(req[i]) = 0; else get<0>(req[i]) = 1; if(get<0>(req[i]) == 0){ tree[get<1>(req[i])].push_back(++C); get<1>(req[i]) = C; arr[C] = get<2>(req[i]); } } C = 0; dfs(1); for(int i = 0;i<q;i++){ if(!get<0>(req[i])){ int p = get<1>(req[i]); modify(0,0,C,eul[p].fs,dp[p]); } else{ int a = get<1>(req[i]),b = get<2>(req[i]); cout<<getans(0,0,C,eul[b].fs,eul[b].sc,dp[a])<<'\n'; } } 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...