Submission #671263

#TimeUsernameProblemLanguageResultExecution timeMemory
671263NimbostratusKlasika (COCI20_klasika)C++17
0 / 110
807 ms180004 KiB
#include <bits/stdc++.h> #define endl '\n' using namespace std; using lint = long long; const int maxn = 2e5 + 5; const int inf = 1e9 + 5; const int mod = 1e9 + 7; struct node { int ch[2] = {0, 0}; set<pair<int, int>> s; }; int n, q; int tin[maxn], tout[maxn]; vector<int> adj[maxn]; int val[maxn]; array<int, 3> qry[maxn]; vector<node> trie; void dfs(int u, int p) { static int timer = 0; tin[u] = ++timer; for(int v : adj[u]) { if(v == p) continue; dfs(v, u); } tout[u] = ++timer; } //k at most 31 void add(int idx, int k, int num, int u) { trie[idx].s.insert({tin[u], tout[u]}); if(k == 0) return; if(!trie[idx].ch[0]) { trie.push_back(node()); trie[idx].ch[0] = trie.size() - 1; } if(!trie[idx].ch[1]) { trie.push_back(node()); trie[idx].ch[1] = trie.size() - 1; } int newidx = trie[idx].ch[!!(num & (1 << (k - 1)))]; add(newidx, k - 1, num, u); } //k at most 31 int query(int idx, int k, int num, int u) { if(k == 0) return 0; if(!trie[idx].ch[0]) { trie.push_back(node()); trie[idx].ch[0] = trie.size() - 1; } if(!trie[idx].ch[1]) { trie.push_back(node()); trie[idx].ch[1] = trie.size() - 1; } int curbit = !!(num & (1 << (k - 1))); auto& s = trie[trie[idx].ch[1 ^ curbit]].s; auto it = s.lower_bound({tin[u], tout[u]}); if(it == s.end() || it->first > tout[u]) return query(trie[idx].ch[curbit], k - 1, num, u); return (1 << (k - 1)) | query(trie[idx].ch[1 ^ curbit], k - 1, num, u); } signed main() { #ifdef Local freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> q; n = 1; for(int i = 1; i <= q; i++) { int x, y; string op; cin >> op >> x >> y; if(op == "Add") { qry[i][0] = 1; n++; qry[i][1] = x; qry[i][2] = n; adj[x].push_back(n); val[n] = val[x] ^ y; } else { qry[i][0] = 2; qry[i][1] = x; qry[i][2] = y; } } dfs(1, 0); trie.push_back(node()); for(int i = 1; i <= q; i++) { if(qry[i][0] == 1) add(0, 31, val[qry[i][2]], qry[i][2]); else cout << query(0, 31, val[qry[i][1]], qry[i][2]) << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...