Submission #1173132

#TimeUsernameProblemLanguageResultExecution timeMemory
1173132rayan_bdKlasika (COCI20_klasika)C++17
0 / 110
5093 ms104008 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds; 


#define getar(ar,n) for(ll i=0;i<n;++i) cin>>ar[i]
#define show(n) cout<<n<<'\n'
#define all(v) v.begin(), v.end()
#define br cout<<"\n"
#define pb push_back
#define nl '\n'
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define ret return
#define ll long long
#define ld long double
#define sza(x) ((int)x.size())
#define fi first
#define se second

const int mxN = 3e5 + 50;
const ll MOD = 1e9 + 7;
const ll INF = 1e9;
const ld EPS = 1e-9;

ll N=1,idx=0,parent[mxN],depth[mxN],heavy[mxN],head[mxN],sz[mxN],lt[mxN],tin[mxN],tout[mxN],seg[mxN*4],val[mxN],till[mxN];
vector<pair<ll,ll>> adj[mxN];

struct Node {
	Node* children[2];
	Node(){
		for(ll i=0;i<2;++i){
			children[i]=NULL;
		}
	}
};

struct Trie{
	Node* root = new Node();
	void add(ll x){
		Node* curr=root;
		for(ll i=32;i>=0;--i){
			ll curr_bit=(x&(1ll<<i))>0;
			if(curr->children[curr_bit]==NULL){
				curr->children[curr_bit]=new Node();
			}
			curr=curr->children[curr_bit];
		}
	}
	ll qry(ll x){
		Node* curr=root;
		ll ans=0;
		for(ll i=32;i>=0;--i){
			ll curr_bit=((x&(1ll<<i))>0);
			if(curr->children[!curr_bit]!=NULL){
				curr=curr->children[!curr_bit];
				ans|=(1ll<<i);
			}else{
				curr=curr->children[curr_bit];
			}
			if(curr==NULL) break;
		}
		return ans;
	}
} t[mxN*4];

struct Seg {
  void update_1(ll node,ll start,ll end,ll idx,ll val){
  	if(start==end){
  		seg[node]=val;
  		return;
  	}
  	ll mid=start+(end-start)/2;
  	if(idx<=mid) update_1(node*2+1,start,mid,idx,val);
  	else update_1(node*2+2,mid+1,end,idx,val);
  	seg[node]=seg[node*2+1]^seg[node*2+2];
  }
  void update_2(ll node,ll start,ll end,ll idx,ll val){
  	t[node].add(val);
  	if(start==end) return;
  	ll mid=start+(end-start)/2;
  	if(idx<=mid) update_2(node*2+1,start,mid,idx,val);
  	else update_2(node*2+2,mid+1,end,idx,val);
  }
  ll qry_answer(ll node,ll start,ll end,ll l,ll r,ll val){
  	if(start==end) return t[node].qry(val);
  	ll mid=start+(end-start)/2;
  	if(r<=mid) return qry_answer(node*2+1,start,mid,l,r,val);
  	else if(l>mid) return qry_answer(node*2+2,mid+1,end,l,r,val);
  	else return max(qry_answer(node*2+1,start,mid,l,mid,val),qry_answer(node*2+2,mid+1,end,mid+1,r,val));
  }
  ll xor_qry(ll node,ll start,ll end,ll l,ll r){
  	if(start>r||end<l) return 0;
  	if(start>=l&&end<=r) return seg[node];
  	ll mid=start+(end-start)/2;
  	return xor_qry(node*2+1,start,mid,l,r)^xor_qry(node*2+2,mid+1,end,l,r);
  }
} seg_tree;

struct HLD {

	void dfs(ll u=1,ll par=0){
		sz[u]=1;
		parent[u]=par;
		depth[u]=depth[par]+1;
		for(auto it:adj[u]){
			if(it.fi^par){
				dfs(it.fi,u);
				val[it.fi]=it.se;
				sz[u]+=sz[it.fi];
				if(sz[heavy[u]]<sz[it.fi]) heavy[u]=it.fi; 
			}
		}
	}

	void dfsHLD(ll u=1,ll chain=1){
		head[u]=chain;
		lt[idx]=val[u];
		tin[u]=idx++;
		seg_tree.update_1(0,0,N-1,tin[u],val[u]);
		if(heavy[u]!=0) dfsHLD(heavy[u],chain);
		for(auto it:adj[u]){
			if(it.fi!=parent[u]&&it.fi!=heavy[u]) dfsHLD(it.fi,it.fi);
		}
		tout[u]=idx-1;
	}

	ll path_xor(ll u,ll v){
		ll ans=0;
		while(head[u]!=head[v]){
			if(depth[head[u]]<depth[head[v]]) swap(u,v);
			ans=ans^seg_tree.xor_qry(0,0,N-1,tin[head[u]],tin[u]);
			u=parent[head[u]];
		}
		if(depth[u]<depth[v]) swap(u,v);
		return (ans^seg_tree.xor_qry(0,0,N-1,tin[v],tin[u]))^val[v];
	}	

} hld;


void lets_go() {
	ll q,u,v;cin>>q;
	string type;
	vector<vector<ll>> Q; // 1-> add ,0-> query
	for(ll i=0;i<q;++i){
		cin>>type>>u>>v;
		if(type=="Add"){
			Q.pb({1,u,++N,v});
			adj[u].pb({N,v});
		}else{
			Q.pb({0,u,v});
		}
	}
	hld.dfs();
	hld.dfsHLD();
	for(auto it:Q){
		if(it[0]==1){
			till[it[2]]=till[it[1]]^it[3];
			seg_tree.update_2(0,0,N-1,tin[it[2]],till[it[2]]);
		}else{
			u=it[1],v=it[2];
			show(seg_tree.qry_answer(0,0,N-1,tin[v],tout[v],hld.path_xor(u,v)^till[v]));
		}
	}
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    lets_go();
    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...