Submission #1306613

#TimeUsernameProblemLanguageResultExecution timeMemory
1306613DangKhoizzzzKlasika (COCI20_klasika)C++20
110 / 110
605 ms248608 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair <int , int>
#define arr3 array <int , 3>
#define BIT(x, k) ((x >> k) & 1)

using namespace std;

const int maxn = 2e5 + 7;
const int INF = 1e9;

struct info 
{
    string t;
    int c1 , c2;
} query[maxn]; 

struct node
{
    int c[2];
    vector <pii> pos;
    node() {c[0] = c[1] = -1; }
};
vector <node> trie;

void add(int x , int p , int time)
{
    int cur = 0;
    for(int i = 30; i >= 0; i--)
    {
        if(trie[cur].c[BIT(x , i)] == -1) 
        {
            trie[cur].c[BIT(x , i)] = trie.size();
            trie.push_back(node());
        }
        cur = trie[cur].c[BIT(x , i)];
        trie[cur].pos.push_back({p , time});
    }
}

bool check(int cur , int l , int r , int time)
{
    auto st = lower_bound(trie[cur].pos.begin() , trie[cur].pos.end() , (pii){l , -1});
    for(; st < trie[cur].pos.end() && st->fi <= r; st++)
    {
        if(st->se <= time) return true;
    }
    return false;
}

int ask(int x , int l , int r , int time)
{
    int res = 0 , cur = 0;
    for(int i = 30; i >= 0; i--)
    {
        int f = (1^BIT(x , i));
        int cf = trie[cur].c[f];
        if(cf != -1 && check(cf , l , r , time))
        {
            res ^= (1 << i);
            cur = cf;
        }
        else cur = trie[cur].c[f^1];
    }
    return res;
}

int pre[maxn] , q , n = 1 , tin[maxn] , tout[maxn] , time_dfs = 0;
vector <int> g[maxn];
void dfs(int u)
{
    tin[u] = ++time_dfs;
    for(int v: g[u]) dfs(v);     
    tout[u] = time_dfs;
}
void solve()
{
    cin >> q;
    trie.push_back(node());
    vector <arr3> add_op = {{0 , 1 , 0}};
    for(int i = 1; i <= q; i++)
    {
        cin >> query[i].t >> query[i].c1 >> query[i].c2;
        if(query[i].t == "Add")
        {
            auto [t , x , y] = query[i];
            n++;
            g[x].push_back(n);
            pre[n] = (pre[x] ^ y);
            add_op.push_back({pre[n] , n , i});
        }
    }
    dfs(1);
    for(auto [x , y , z]: add_op) add(x , tin[y] , z);
    for(auto &tmp: trie) sort(tmp.pos.begin() , tmp.pos.end()); 
    for(int i = 1 , cnt = 1; i <= q; i++)
    {
        if(query[i].t == "Query") cout << ask(pre[query[i].c1] , tin[query[i].c2] , tout[query[i].c2] , i) << '\n';
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    solve();
    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...