Submission #868786

#TimeUsernameProblemLanguageResultExecution timeMemory
868786pccKlasika (COCI20_klasika)C++14
0 / 110
816 ms519704 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; const int magic = 100; const int SZ = mxn*150; int head[mxn],nedge[mxn],dir[mxn]; bitset<mxn> active; int arr[mxn],dp[mxn]; pii eul[mxn]; pii trie[SZ]; int segtree[mxn*4]; int ppp = 0; int ptr = 0; int C = 0; tiii req[mxn]; void addedge(int s,int e){ ptr++; nedge[ptr] = head[s]; head[s] = ptr; dir[ptr] = e; return; } int newnode(){ assert(++ppp<SZ); 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(r-l<magic)return; 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(r-l<magic){ int re = -1; for(int i = max(l,s);i<=min(e,r);i++){ if(!active[i])continue; re = max(re,dp[i]^tar); } return re; } 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; while(head[now] != 0){ int tmp = head[now]; int nxt = dir[tmp]; dp[nxt] ^= dp[now]; dfs(nxt); head[now] = nedge[tmp]; } eul[now].sc = C; return; } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int q; cin>>q; 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){ addedge(get<1>(req[i]),++C); get<1>(req[i]) = C; arr[C] = get<2>(req[i]); } } C = 0; dfs(1); active[1] = true; modify(0,0,C,eul[1].fs,0); for(int i = 0;i<q;i++){ if(!get<0>(req[i])){ int p = get<1>(req[i]); active[p] = true; 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...