Submission #405225

#TimeUsernameProblemLanguageResultExecution timeMemory
405225ngpin04Klasika (COCI20_klasika)C++14
33 / 110
1193 ms524288 KiB
#include <bits/stdc++.h> #define fi first #define se second #define mp make_pair using namespace std; const int N = 2e5 + 5; int getbit(int x, int i) { return (x >> i) & 1; } struct trie { int node; vector <int> ptr; trie() { node = 0; ptr.push_back(0); ptr.push_back(0); } void add(int x) { int cur = 0; for (int i = 29; i >= 0; i--) { int &p = ptr[cur << 1 | getbit(x, i)]; if (!p) { p = ++node; ptr.push_back(0); ptr.push_back(0); } cur = ptr[cur << 1 | getbit(x, i)]; } } int getmax(int x) { int cur = 0; int res = 0; for (int i = 29; i >= 0; i--) { bool found = false; for (int val = 1; val >= 0; val--) { int b = val ^ getbit(x, i); int p = ptr[cur << 1 | b]; if (!p) continue; found = true; cur = p; res |= (val << i); break; } if (!found) return -1; } return res; } }; trie st[4 * N]; vector <int> adj[N]; pair <int, int> pir[N]; int tin[N]; int val[N]; int tout[N]; int n = 1,q,timer; string op[N]; void update(int id, int l, int r, int pos, int val) { if (l > pos || r < pos) return; st[id].add(val); if (l == r) return; int mid = (l + r) >> 1; update(id << 1, l, mid, pos, val); update(id << 1 | 1, mid + 1, r, pos, val); } int getmax(int id, int l, int r, int u, int v, int val) { if (l > v || r < u) return -1; if (u <= l && r <= v) return st[id].getmax(val); int mid = (l + r) >> 1; int lnode = getmax(id << 1, l, mid, u, v, val); int rnode = getmax(id << 1 | 1, mid + 1, r, u, v, val); return max(lnode, rnode); } void dfs(int u) { tin[u] = ++timer; for (int v : adj[u]) dfs(v); tout[u] = timer; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> q; for (int i = 1; i <= q; i++) cin >> op[i] >> pir[i].fi >> pir[i].se; for (int i = 1; i <= q; i++) if (op[i] == "Add") { val[++n] = val[pir[i].fi] ^ pir[i].se; adj[pir[i].fi].push_back(n); pir[i].fi = n; } dfs(1); update(1, 1, n, tin[1], val[1]); for (int i = 1; i <= q; i++) { if (op[i] == "Add") update(1, 1, n, tin[pir[i].fi], val[pir[i].fi]); else { int l = tin[pir[i].se]; int r = tout[pir[i].se]; cout << getmax(1, 1, n, l, r, val[pir[i].fi]) << "\n"; } } 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...