Submission #1270739

#TimeUsernameProblemLanguageResultExecution timeMemory
1270739_wesstiov_Klasika (COCI20_klasika)C++17
110 / 110
581 ms339828 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long const int MXN = 2e5; const int INF = 1e9; int n = 1, q; vector<int> adj[MXN + 5]; int dist[MXN + 5]; struct Coup{ int a ,sz , i; Coup (int a,int sz,int i) : a(a) , sz(sz) , i(i){} }; vector<Coup> query[MXN + 5]; struct Trie{ struct Node{ int nxt[2]; int mark = INF; Node(){ memset(nxt , -1 ,sizeof nxt); } }; vector<Node> trie = vector<Node>(1); void addNum(int x ,int t){ int v = 0; for (int i = 30; i >= 0; i--){ bool b = (x >> i & 1); if (trie[v].nxt[b] == -1){ trie.push_back(Node()); trie[v].nxt[b] = trie.size() - 1; } v = trie[v].nxt[b]; trie[v].mark = min(trie[v].mark , t); } return; } int getMax(int x,int t){ int v = 0 , ans = 0; for (int i = 30; i >= 0; i--){ bool b = (x >> i & 1); int nxt_v0 = trie[v].nxt[b] , nxt_v1 = trie[v].nxt[b ^ 1]; if (nxt_v1 != -1 and trie[nxt_v1].mark <= t){ v = nxt_v1; ans |= (1 << i); }else v = nxt_v0; if (v == -1 or trie[v].mark > t) return 0; } return ans; } }; vector<int> lst[MXN + 5]; Trie vex[MXN + 5]; int ANS[MXN + 5]; void dfs(int u,int par){ lst[u].emplace_back(u); vex[u].addNum(dist[u] , u); for (auto v : adj[u]){ if (v == par) continue; dfs(v , u); if (lst[u].size() < lst[v].size()) { swap(lst[u] , lst[v]); swap(vex[u] , vex[v]); } for (auto p : lst[v]) { lst[u].emplace_back(p); vex[u].addNum(dist[p] , p); } } for (auto [a , sz , i] : query[u]){ ANS[i] = vex[u].getMax(a , sz); } } signed main(){ cin.tie(0)->ios_base::sync_with_stdio(0); // freopen("SPEED.INP" , "r" , stdin); // freopen("SPEED.OUT" , "w" , stdout); cin >> q; for (int i = 1; i <= q;i++){ string type; cin >> type; if (type == "Add"){ int x , y; cin >> x >> y; adj[x].emplace_back(++n); adj[n].emplace_back(x); dist[n] = dist[x] ^ y; }else{ int a, b; cin >> a >> b; query[b].emplace_back(dist[a] , n , i); } } memset(ANS , -1 , sizeof ANS); dfs(1 , 1); for (int i = 1; i <= q ;i++){ if (ANS[i] == -1) continue; cout << ANS[i] <<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...