Submission #257129

#TimeUsernameProblemLanguageResultExecution timeMemory
257129blacktulipKlasika (COCI20_klasika)C++17
33 / 110
1321 ms524292 KiB
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include <bits/stdc++.h>

using namespace std;

typedef long long lo;
typedef pair< lo,lo > PII;

#define fi first
#define se second
#define mp make_pair
#define int long long
#define endl "\n"
#define pb push_back
#define fio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define FOR for(int i=1;i<=n;i++)
#define mid ((start+end)/2)
#define ort ((bas+son)/2)

const lo inf = 1000000000000000000;
const lo KOK = 100000;
const lo LOG = 30;
const lo li = 200005;
const lo mod = 1000000007;

int n,m,b[li],a[li],k,flag,t,say=1,nodee=1,visit[li*40][5],xorr[li],l[li],r[li],x[li],y[li],q;
int cev;
char s[li][10];
set<int> st[li*40];
vector<int> v,vec[li],vect;

inline void build_trie(int xxx){
	int node=1;
	//~ cout<<xxx<<"*(*(*(\n";
	for(int i=0;i<(int)v.size();i++){
		st[node].insert(xxx);
		if(visit[node][v[i]])node=visit[node][v[i]];
		else{
			visit[node][v[i]]=++nodee;
			node=nodee;
		}
	}
	st[node].insert(xxx);
}

inline void ask_trie(int xx){
	int node=1;
	//~ cout<<l[xx]<<" : :  : "<<r[xx]<<endl;
	for(int i=0;i<(int)v.size();i++){
		auto it=st[visit[node][!v[i]]].lower_bound(l[xx]);
		//~ if(xx==3 && node==1)cout<<node<<"****"<<endl;
		//~ if(visit[node][!v[i]]){
		int yess=0;
			//~ cout<<*it<<endl;
			if(it!=st[visit[node][!v[i]]].end()){
				//~ if(xx==3)cout<<*it<<endl;
				
				if(visit[node][!v[i]] && *it<=r[xx]){node=visit[node][!v[i]];vect.pb(1);yess=1;}
			}
		//~ }
		if(yess==0){node=visit[node][v[i]];vect.pb(0);}
	}
}

inline void dfs(int node,int ata){
	l[node]=++q;
	r[node]=q;
	for(int i=0;i<(int)vec[node].size();i++){
		int go=vec[node][i];
		if(go==ata)continue;
		dfs(go,node);
		r[node]=max(r[node],r[go]);
	}
}

main(void){
	//~ freopen("at.txt","r",stdin);
	//~ freopen("att.txt","w",stdout);
	scanf("%lld",&t);
	for(int i=1;i<=36;i++)v.pb(0);
	build_trie(1);
	for(int i=1;i<=t;i++){
		//~ int x,y;
		scanf("%s %lld %lld",s[i],&x[i],&y[i]);
		if(s[i][0]=='A'){
			//~ xorr[++say]=(xorr[x[i]]^y[i]);
			vec[x[i]].pb(++say);
			vec[say].pb(x[i]);
			//~ v.clear();
			//~ while(at){
				//~ v.pb(at%2);
				//~ at/=2;
			//~ }
			//~ while((int)v.size()<35)v.pb(0);
			//~ reverse(v.begin(),v.end());
			//~ build_trie();
			//~ continue;
		}
		//~ int at=xorr[x];
		//~ v.clear();
		//~ while(at){
			//~ v.pb(at%2);
			//~ at/=2;
		//~ }
		//~ while((int)v.size()<35)v.pb(0);
		//~ reverse(v.begin(),v.end());
		//~ vect.clear();
		//~ ask_trie();
		//~ reverse(vect.begin(),vect.end());
		//~ int ans=0;
		//~ for(int i=0;i<(int)vect.size();i++){
			//~ if(vect[i]==1)ans=(ans^(1ll<<i));
		//~ }
		//~ printf("%lld\n",ans);
	}
	dfs(1,0);
	//~ cout<<l[5]<<" : : "<<r[5]<<" : : "<<xorr[]endl;
	say=1;
	for(int i=1;i<=t;i++){
		if(s[i][0]=='A'){
			xorr[++say]=(xorr[x[i]]^y[i]);
			//~ vec[x[i]].pb(say);
			int at=xorr[say];
			//~ vec[say].pb(x[i]);
			v.clear();
			while(at){
				v.pb(at%2);
				at/=2;
			}
			while((int)v.size()<35)v.pb(0);
			reverse(v.begin(),v.end());
			build_trie(l[say]);
			continue;
		}
		int at=xorr[x[i]];
		v.clear();
		while(at){
			v.pb(at%2);
			at/=2;
		}
		while((int)v.size()<35)v.pb(0);
		reverse(v.begin(),v.end());
		vect.clear();
		ask_trie(y[i]);
		reverse(vect.begin(),vect.end());
		int ans=0;
		for(int j=0;j<(int)vect.size();j++){
			if(vect[j]==1)ans=(ans^(1ll<<j));
		}
		printf("%lld\n",ans);
	}
	//~ cout<<xorr[3]<<endl;
	return 0;
}

Compilation message (stderr)

klasika.cpp:78:10: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main(void){
          ^
klasika.cpp: In function 'int main()':
klasika.cpp:81:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld",&t);
  ~~~~~^~~~~~~~~~~
klasika.cpp:86:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s %lld %lld",s[i],&x[i],&y[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...