제출 #1326954

#제출 시각아이디문제언어결과실행 시간메모리
1326954goats_9Klasika (COCI20_klasika)C++20
33 / 110
549 ms589824 KiB
/* Author: goats_9 */ #include <bits/stdc++.h> using namespace std; using ll = long long; struct Trie { enum { D = 30, K = 2 }; struct Node { vector<int> nxt = vector<int> (K, -1); int ts = numeric_limits<int>::max(); }; vector<Node> tr; Trie() : tr(1, Node()) {} void add(int x, int t) { int cur = 0; for (int j = D - 1; j >= 0; j--) { int b = x >> j & 1; if (tr[cur].nxt[b] == -1) { tr[cur].nxt[b] = (int)tr.size(); tr.push_back(Node()); } cur = tr[cur].nxt[b]; tr[cur].ts = min(tr[cur].ts, t); } } int query(int x, int t) { int cur = 0, ans = x; for (int j = D - 1; j >= 0; j--) { int b = x >> j & 1; b ^= 1; if (tr[cur].nxt[b] == -1 || tr[tr[cur].nxt[b]].ts > t) b ^= 1; cur = tr[cur].nxt[b]; ans ^= b << j; } return ans; } }; int main() { cin.tie(0)->sync_with_stdio(0); int q; cin >> q; vector<int> a(1), t(1); vector<pair<int, int>> ans; vector<vector<int>> sub(1), g(1); vector<vector<pair<int, int>>> qr(1); vector<Trie> trie(1); for (int i = 0; i < q; i++) { string s; cin >> s; if (s == "Add") { int x, y; cin >> x >> y; --x; a.push_back(a[x] ^ y); t.push_back(i); sub.push_back({}); g[x].push_back((int)g.size()); g.push_back({}); qr.push_back({}); trie.push_back(Trie()); } else { int x, y; cin >> x >> y; qr[--y].emplace_back(--x, i); } } auto dfs = [&] (auto&& self, int u) -> void { for (auto v : g[u]) self(self, v); sort(g[u].rbegin(), g[u].rend(), [&] (int x, int y) { return sub[x].size() < sub[y].size(); }); if (!g[u].empty()) { swap(trie[u], trie[g[u][0]]); swap(sub[u], sub[g[u][0]]); for (int i = 1; i < (int)g[u].size(); i++) { for (auto z : sub[g[u][i]]) trie[u].add(a[z], t[z]); sub[u].insert(sub[u].end(), sub[g[u][i]].begin(), sub[g[u][i]].end()); } } trie[u].add(a[u], t[u]); sub[u].push_back(u); for (auto [z, i] : qr[u]) ans.emplace_back(i, trie[u].query(a[z], i)); }; dfs(dfs, 0); sort(ans.begin(), ans.end()); for (auto [_, z] : ans) cout << z << '\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...