Submission #922355

#TimeUsernameProblemLanguageResultExecution timeMemory
922355Shayan86Klasika (COCI20_klasika)C++14
110 / 110
2853 ms414532 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
// Ofast, O0, O1, O2, O3, unroll-loops, fast-math, trapv

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;

#define Mp          make_pair
#define sep         ' '
#define endl        '\n'
#define F	        first
#define S	        second
#define pb          push_back
#define all(x)      (x).begin(),(x).end()
#define kill(res)	cout << res << '\n', exit(0);
#define set_dec(x)	cout << fixed << setprecision(x);
#define fast_io     ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io     freopen("input.txt", "r", stdin) ; freopen("output.txt", "w", stdout);

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll L = 31;
const ll N = 2e5 + 50;
const ll M = 3e6 + 50;
const ll Mod = 1e9 + 7;

int n, q, sum[N], st[N], ft[N], timer = 1;

vector<int> adj[N];
vector<pair<char, pii>> qu;

void dfs(int v){
    st[v] = timer++;
    for(int u: adj[v]) dfs(u);
    ft[v] = timer;
}

int trieInd = 1, child[M][2];

set<int> idx[M];

void add(int x){
    int cur = 0;
    for(int i = L-1; i >= 0; i--){
        int th = sum[x] >> i & 1;
        if(!child[cur][th]) child[cur][th] = trieInd++;
        cur = child[cur][th]; idx[cur].insert(st[x]);
    }
}

bool ok(int l, int r, int id){
    auto y = idx[id].lower_bound(l);
    return (y != idx[id].end() && (*y) < r);
}

int get(int x, int l, int r){
    int cur = 0, ans = 0;
    for(int i = L-1; i >= 0; i--){
        int th = x >> i & 1;
        if(child[cur][1-th] && ok(l, r, child[cur][1-th])){
            ans += (1 << i); cur = child[cur][1-th];
        }
        else cur = child[cur][th];
    }
    return ans;
}

int main(){
    fast_io;

    cin >> q;

    n = 1;
    for(int i = 1; i <= q; i++){
        string t; int a, b;
        cin >> t >> a >> b;

        if(t[0] == 'A'){
            adj[a].pb(++n);
            sum[n] = sum[a] ^ b;
        }
        qu.pb({t[0], {a, b}});
    }

    dfs(1);

    int m = 1; add(1);
    for(auto [t, e]: qu){
        int a = e.F, b = e.S;

        if(t == 'A') add(++m);
        else cout << get(sum[a], st[b], ft[b]) << endl;
    }

}

Compilation message (stderr)

klasika.cpp: In function 'int main()':
klasika.cpp:92:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   92 |     for(auto [t, e]: qu){
      |              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...