Submission #223401

#TimeUsernameProblemLanguageResultExecution timeMemory
223401dantoh000Klasika (COCI20_klasika)C++14
66 / 110
4062 ms207732 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 200005;
const int LOGN = 20;
int num[N], d[N];
int p[N][LOGN];
int sz;
int ct = 1;
struct node{
    int s,e,m,v;
    node *l = NULL, *r = NULL;
    node (int _s, int _e): s(_s), e(_e){
        m = (s+e)/2;
        v = 0;
    }
    void build(){
        l = new node(s,m);
        r = new node(m+1,e);
    }
    void up(int x){
        //printf("update %d %d %d\n",s,e,x);
        v = 1;
        if (s == e){
            return;
        }
        if (x <= m){
            if (l == NULL) build();
            l->up(x);
        }
        else{
            if (r == NULL) build();
            r->up(x);
        }
    }
    int query(int id, int x){
        //printf("segment tree: %d %d %d %d\n",s,e,id,x);
        if (s == e){
            return s^x;
        }
        if (x & (1<<id)){
            //printf("prefer left\n");
            if (l == NULL || l->v == 0){
                //printf("right anyway\n");
                return r->query(id-1,x);
            }
            else return l->query(id-1,x);
        }
        else{
            //printf("prefer right\n");
            if (r == NULL || r->v == 0) {
                //printf("left anyway\n");
                return l->query(id-1,x);
            }
            else return r->query(id-1,x);
        }
    }
}*root;
int is_parent(int u, int v){
    int dif = d[u] - d[v];
    if (dif < 0) return 0;
    while (dif){
        int lsb = 31-__builtin_clz(dif);
        u = p[u][lsb];
        dif -= (1<<lsb);
    }
    return (u==v);
}
int main() {
	int q;
	cin >> q;
    root = new node(0,(int)((unsigned)(1<<31)-1));
    root -> up(0);
	while (q--) {
        string Q;
        int a,b;
		cin >> Q >> a >> b;
		if (Q == "Add"){
            num[++ct] = num[a]^b;
            //printf("added %d %d\n",ct,num[ct]);
            p[ct][0] = a;
            d[ct] = d[a]+1;
            for (int k = 1; k < LOGN; k++){
                if (p[ct][k-1] == -1) break;
                p[ct][k] = p[p[ct][k-1]][k-1];
            }
            root->up(num[ct]);
		}
        else if (Q == "Query"){
            if (q <= 2000){
                int ans = 0;
                for (int i = 1; i <= ct; i++){
                    if (is_parent(i,b)){
                        ans = max(ans,num[i]^num[a]);
                    }
                }
                printf("%d\n",ans);
            }
            else{
                printf("%d\n",root->query(30,num[a]));
            }
        }
	}
	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...