This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
#define int int64_t
#define pb push_back
const int lim=2e5+500;
const int mod=1e9+7;
const int llim=3e7;
using pii=pair<int,int>;
struct trie{
struct node{
signed c[2]{0,0};
};
static node nds[llim];
static int nextnode;
using pnode=node*;
pnode root;
trie(){root=nds+(nextnode++);}
void insert(int x){
assert(nextnode<llim);
pnode cur=root;
for(int i=29;0<=i;i--){
if(!cur->c[(x>>i)&1]){
cur->c[(x>>i)&1]=nextnode++;
}
cur=nds+cur->c[(x>>i)&1];
}
}
int search(int x){
pnode cur=root;
int ans=0;
for(int i=29;0<=i;i--){
if(cur->c[!((x>>i)&1)]){
if(!((x>>i)&1))ans+=1<<i;
cur=nds+cur->c[!((x>>i)&1)];
}else if(cur->c[(x>>i)&1]){
if((x>>i)&1)ans+=1<<i;
cur=nds+cur->c[(x>>i)&1];
}else{
return 0;
}
}
return ans^x;
}
};
int trie::nextnode=1;
trie::node trie::nds[llim];
struct segtree{
trie tree[2*lim];
int n;
void update(int p,int val){
for(p+=n;p;p>>=1)tree[p].insert(val);
}
int query(int l,int r,int x){
int ans=0;
for(l+=n,r+=n+1;l<r;l>>=1,r>>=1){
if(l&1){
ans=max(ans,tree[l++].search(x));
}
if(r&1){
ans=max(ans,tree[--r].search(x));
}
}
return ans;
}
}st;
struct qdata{
int ty,x,y;
};
vector<pii>v[lim];
int dist[lim];
int tin[lim],tout[lim],tt=0;
void dfs(int node){
//cerr<<node<<"\n";
tin[node]=tt++;
for(auto[j,c]:v[node]){
dist[j]=dist[node]^c;
dfs(j);
}
tout[node]=tt-1;
}
signed main(){
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#ifdef Local
freopen(".in","r",stdin); freopen(".out","w",stdout);
cerr<<sizeof(trie::nds)/1000000<<"\n";
#endif
int n;
cin>>n;
qdata q[n];
int curnode=2;
for(int i=0;i<n;i++){
string ty;
cin>>ty>>q[i].x>>q[i].y;
if(ty=="Add"){
q[i].ty=0;
v[q[i].x].pb({curnode,q[i].y});
curnode++;
}else{
q[i].ty=1;
}
}
dfs(1);
st.n=tt+50;
st.update(tin[1],0);
curnode=2;
for(int i=0;i<n;i++){
if(!q[i].ty){
st.update(tin[curnode],dist[curnode]);
curnode++;
}else{
cout<<st.query(tin[q[i].y],tout[q[i].y],dist[q[i].x])<<"\n";
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |