Submission #1180762

#TimeUsernameProblemLanguageResultExecution timeMemory
1180762sleepntsheepKlasika (COCI20_klasika)C++17
0 / 110
5095 ms14424 KiB
#include<stdio.h>
#include<algorithm>
#define N 200055
#define B 2500

int nq,n,hd[N],fa[N],nxt[N+N],vv_[N+N],ii,jj=1,dfn[N],out[N],dfc,ii_,dp[N],dq[N];
void Lnk(int u,int v){int i=++ii;nxt[i]=hd[u];vv_[i]=v;hd[u]=i;}
void dfs(int u,int p){
    dq[dfc]=-1;
    dfn[u]=dfc++;
    for(int j=hd[u];j;j=nxt[j])if(vv_[j]-p)dfs(vv_[j],u);
    out[u]=dfc;
}

struct QQ{char op[5];int a,b;}q[N];

int rt[3000];
struct{int lc,rc;}trie[N*400];
void trieins(int&v,int val,int i){
    if(!v)v=++ii_;
    if(i==-1)return;
    trieins((val>>i)%2?trie[v].rc:trie[v].lc,val,i-1);
}

int trieqry(int t,int val,int i){
    if(i==-1)return 0;
    int want=((val>>i)&1)^1,cnt=0;
    if(0==(want?trie[t].rc:trie[t].lc)){
	return trieqry(want?trie[t].lc:trie[t].rc,val,i-1);
    }else{
	return (1<<i)^trieqry(want?trie[t].rc:trie[t].lc,val,i-1);
    }
}

int main(){
    scanf("%d",&nq);
    for(int i=0;i<nq;++i){
	scanf("%s%d%d",q[i].op,&q[i].a,&q[i].b);
	if(q[i].op[0]=='A'){
	    fa[++jj]=q[i].a;
	    dp[jj]=dp[fa[jj]]^q[i].b;
	    Lnk(fa[jj],jj);
	    q[i].a=jj;
	}
    }
    n=jj;
    dfs(1,1);
    trieins(rt[0],0,30);
    for(int i=0;i<nq;++i){
	if(q[i].op[0]=='A'){
	    trieins(rt[dfn[q[i].a]/B],dp[q[i].a],30);
	    dq[dfn[q[i].a]]=dp[q[i].a];
	}else{
	    int z=0,aa=dfn[q[i].b],bb=out[q[i].b]-1,sb=aa/B+1,eb=bb/B,da=dp[q[i].a];
	    auto C=[&](int i){
		if(dq[i]!=-1&&(dq[i]^da)>z)z=da^dq[i];
	    };
	    if(sb<=eb&&0){
		for(int i=sb;i<eb;++i)
		    z=std::max(z,trieqry(rt[i],dp[q[i].a],30));
		for(int i=aa;i<sb*B;++i)C(i);
		for(int i=eb*B;i<=bb;++i)C(i);
	    }else{
		for(int i=aa;i<=bb;++i)C(i);
	    }
	    printf("%d\n",z);
	}
    }

    return 0;
}

Compilation message (stderr)

klasika.cpp: In function 'int main()':
klasika.cpp:36:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |     scanf("%d",&nq);
      |     ~~~~~^~~~~~~~~~
klasika.cpp:38:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |         scanf("%s%d%d",q[i].op,&q[i].a,&q[i].b);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...