This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// ---PhucDang--- //
#include<bits/stdc++.h>
#define name "practice"
#define maxn 200010
#define oo LLONG_MAX
#define INF INT_MAX
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define CONST
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define e endl
using namespace std;
typedef long long ll;
template<class T> void MIN(T &A, T B) {A=min(A,B);}
template<class T> void MAX(T &A, T B) {A=max(A,B);}
template<class T> void SUM(T &A, T B) {A=A+B;}
template<class T> void HIEU(T &A, T B) {A=A-B;}
int dis[maxn],q;
vector<int>vec[maxn];
struct Data{
bool type;
int u,v;
};
vector<Data>Q;
int tail[maxn],num[maxn],timedfs=0;
void preDFS(int u, int par){
num[u]=++timedfs;
for(int v: vec[u]){
if(v==par) continue;
preDFS(v,u);
}
tail[u]=timedfs;
}
void pre(void){
int curr=1;
fo(i,1,q){
string type;
int a,b;
cin>>type>>a>>b;
if(type=="Add"){
++curr;
vec[a].pb(curr);
vec[curr].pb(a);
dis[curr]=dis[a]^b;
Q.pb({false,a,curr});
}
else Q.pb({true,a,b});
}
preDFS(1,0);
}
struct node{
int a[2];
set<int>id;
node(){
a[0]=a[1]=0;
id.clear();
}
};
vector<node>trie;
void add(int pos, int depth, int val, int num){
trie[pos].id.insert(num);
if(depth==0) return;
bool bit=(val>>(depth-1))&1;
int u=trie[pos].a[bit];
if(u==0){
trie.pb(node());
trie[pos].a[bit]=trie.size()-1;
u=trie.size()-1;
}
add(u,depth-1,val,num);
}
bool check(set<int> &s, int l, int r){
if(s.lower_bound(l)==s.upper_bound(r)) return false;
return true;
}
int get(int pos, int depth, int l, int r, int xorval){
if(depth==0) return 0;
int u1=trie[pos].a[1];
int u0=trie[pos].a[0];
if((xorval>>(depth-1))&1) swap(u1,u0);
if(u1&&check(trie[u1].id,l,r)){
return (1<<(depth-1))+get(u1,depth-1,l,r,xorval);
}
else{
return get(u0,depth-1,l,r,xorval);
}
}
void process(void){
pre();
trie.pb(node());
add(0,30,dis[1],num[1]);
for(auto [type,u,v]: Q){
if(type==false) add(0,30,dis[v],num[v]);
else cout<<get(0,30,num[v],tail[v],dis[u])<<e;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// freopen(name".inp","r",stdin);
// freopen(name".out","w",stdout);
cin>>q;
process();
}
# | 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... |