Submission #1306380

#TimeUsernameProblemLanguageResultExecution timeMemory
1306380Jean7Klasika (COCI20_klasika)C++20
110 / 110
289 ms133964 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std ;

const int N = 2e5+5 ;
const int L = 31 ;
const int O = 1e18 ;

vector <pair<int,int>> g[N] , v[N] ;
int q , n , tt[N] , pre[N] , ans[N] ;

struct Trie {
    int tree[N*L][2] , time[N*L] , idx = 1 ;
    Trie () {
        for ( int i = 0 ; i < N*L ; i++ ) {
            time[i] = O ;
        }
    }
    void init () {
        for ( int i = 1 ; i <= idx ; i++ ) {
            time[i] = O ;
            memset ( tree[i] , 0 , sizeof(tree[i]) ) ;
        }
        idx = 1 ;
    }
    void update ( int x , int id ) {
        int cur = 1 ;
        for ( int i = L-1 ; i >= 0 ; i-- ) {
            bool b = ( x & (1ll<<i) ) ;
            if ( !tree[cur][b] ) {
                idx++ ;
                tree[cur][b] = idx ;
            }
            cur = tree[cur][b] ;
            time[cur] = min ( time[cur] , id ) ;
        }
    }
    int query ( int x , int id ) {
        int cur = 1 , ret = 0 ;
        for ( int i = L-1 ; i >= 0 ; i-- ) {
            bool b = ( x & (1ll<<i) ) ;
            if ( time[tree[cur][b^1]] < id ) {
                ret |= (1ll<<i) ;
                cur = tree[cur][b^1] ;
            }
            else {
                cur = tree[cur][b] ;
            }
        }
        return ret ;
    }
} tr ;

struct Sack {
    int sz[N] ;
    vector <int> sub[N] ;
    void build ( int i ) {
        sz[i] = 1 ;
        for ( auto [it,w] : g[i] ) {
            pre[it] = pre[i] ^ w ;
            build ( it ) ;
            sz[i] += sz[it] ;
        }
    }
    void dfs ( int i , bool o ) {
        int big = 0 ;
        for ( auto [it,w] : g[i] ) {
            if ( sz[it] > sz[big] ) {
                big = it ;
            }
        }
        for ( auto [it,w] : g[i] ) {
            if ( it != big ) {
                dfs ( it , 0 ) ;
            }
        }
        if ( big ) {
            dfs ( big , 1 ) ;
            swap ( sub[i] , sub[big] ) ;
        }
        sub[i].push_back(i) ;
        tr.update ( pre[i] , tt[i] ) ;
        for ( auto [it,w] : g[i] ) {
            if ( it != big ) {
                for ( auto x : sub[it] ) {
                    sub[i].push_back(x) ;
                    tr.update ( pre[x] , tt[x] ) ;
                }
            }
        }
        for ( auto [x,id] : v[i] ) {
            ans[id] = tr.query ( pre[x] , id ) ;
        }
        if ( !o ) {
            tr.init () ;
        }
    }
} stl ;

inline void solve () {
    cin >> q ;
    n++ ;
    for ( int i = 1 ; i <= q ; i++ ) {
        ans[i] = -1 ;
        string op ;
        int x , y ;
        cin >> op >> x >> y ;
        if ( op[0] == 'A' ) {
            n++ ;
            tt[n] = i ;
            g[x].push_back({n,y}) ;
        }
        else {
            v[y].push_back({x,i}) ;
        }
    }
    stl.build ( 1 ) ;
    stl.dfs ( 1 , 0 ) ;
    for ( int i = 1 ; i <= q ; i++ ) {
        if ( ans[i] != -1 ) {
            cout << ans[i] << "\n" ;
        }
    }
}

signed main () {
    //freopen ( ".in" , "r" , stdin ) ;
    //freopen ( ".out" , "w" , stdout ) ;
    ios_base::sync_with_stdio(0) ;
    cin.tie(0) ;
    cout.tie(0) ;
    int tc = 1 ;
    //cin >> tc ;
    while ( tc-- ) {
        solve() ;
    }
    return 0 ;
}

///  JJJJJJJ EEEEEEE  AAAAA  NN   NN 7777777
///     JJ   EE      AA   AA NNN  NN     77
///     JJ   EEEEEE  AAAAAAA NN N NN    77
///  JJ JJ   EE      AA   AA NN  NNN   77
///  JJJJJ   EEEEEEE AA   AA NN   NN  77
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...