제출 #1359651

#제출 시각아이디문제언어결과실행 시간메모리
13596510xessamKlasika (COCI20_klasika)C++20
0 / 110
576 ms547032 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N = 2e5 + 5 , Bits = 30;

vector<array<int,2>> g[N] ;
int in[N] , out[N] , pref[N] , me[N] , timer ;
void dfs0(int u) {
    in[u] = timer ++ ;
    for(auto &[v , c] : g[u]) {
        pref[v] = c ^ pref[u] ;
        dfs0(v) ;
    }
    out[u] = timer - 1 ;
}

// O(Bits)
struct binary_trie {
    struct node {
        array<int, 2> go;
        int cnt = 0;
    };
    vector<node> d;

    int add_node() {
        d.push_back(node());
        return d.size() - 1;
    }

    binary_trie() { add_node(); }

    void insert(int x) {
        int rt = 0;
        for (int i = Bits - 1; i >= 0; i--) {
            bool b = (1ll << i) & x;
            if (not d[rt].go[b])
                d[rt].go[b] = add_node();
            rt = d[rt].go[b];
            d[rt].cnt++;
        }
    }
    int max_xor(int x) {
        int rt = 0, ans = 0;
        for (int i = Bits - 1; i >= 0; i--) {
            bool b = !((1ll << i) & x);
            if (d[rt].go[b] and d[d[rt].go[b]].cnt)
                ans += 1ll << i, rt = d[rt].go[b];
            else
                rt = d[rt].go[!b];
        }
        return ans;
    }
};


binary_trie seg[4 * N] ;

void update(int idx , int val , int x , int l , int r) {
    seg[x].insert(val) ;
    if(l == r) return ;
    int mid = (l + r) >> 1 ;
    if (idx <= mid) update(idx , val , x << 1 , l , mid) ;
    else update(idx , val , x << 1 | 1 , mid + 1 , r) ;
}
int get(int val , int x , int l , int r , int ql , int qr) {
    if (l > qr or r < ql) return 0 ;
    if (l >= ql and r <= qr) {
        return seg[x].max_xor(val) ;
    }
    int mid = (l + r) >> 1 ;
    return max(get(val , x << 1 , l , mid , ql , qr) , get(val , x << 1 | 1 , mid + 1 , r , ql , qr)) ;
}

void update(int idx , int val) {
//    cout << "upd : " << idx << " " << val << "\n" ;
    update(idx , val , 1 , 0 , N - 1) ;
}
int get(int val , int l , int r) {
//    cout << "qr : " << val << " " << l << " " << r << "\n" ;
    return get(val , 1 , 0 , N - 1 , l , r) ;
}


int32_t main() {
    #ifdef ECPC
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int q ; cin >> q ;
    vector<array<int,3>> Q(q) ;
    int nodes = 1 ;
    for (int i = 0; i < q; i++) {
        string s ; cin >> s ;
        if (s == "Query") Q[i][0] = 1 ;
        else Q[i][0] = 0 ;
        cin >> Q[i][1] >> Q[i][2] ;
        if (Q[i][0] == 0) {
            int p = Q[i][1] , c = Q[i][2] ;
            g[p].push_back({++nodes, c}) ;
            me[nodes] = c ;
        }
    }

    dfs0(1);

    nodes = 1 ;
    bool flg = 0 ;
    for(auto [tp , a , b] : Q) {
        if (tp) {
            int path = pref[a] ^ pref[b] ^ me[b] ;
            if (flg) cout << "\n" ;
            flg = 1 ;
            cout << get(path , in[b] , out[b]) ;
        }
        else {
            ++nodes ;
            update(in[nodes] , pref[nodes]) ;
        }
    }

}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…