Submission #1132029

#TimeUsernameProblemLanguageResultExecution timeMemory
1132029Sam_arvandiKlasika (COCI20_klasika)C++17
110 / 110
2773 ms478716 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; #define mp make_pair #define IOS ios_base :: sync_with_stdio(false) #define FOR(i, a, b) for(int i = a; i<= b; i++) #define ROF(i, b, a) for(int i = b; i>= a; i--) const int mn = 2e5 + 5; int w[mn], st[mn], ft[mn]; pair<bool , pii> qu[mn]; bool mark[mn]; vector<int> a[mn]; int tmp = 0; void dfs(int u) { tmp++; mark[u] = 1; st[u] = tmp; for(auto v: a[u]) { if (!mark[v]) dfs(v); } ft[u] = tmp; return; } struct Trie { int P = 1; struct Node { int lc = 0, rc = 0; set<int> s; }temp; vector<Node> node; void add(int id, int ind , int x, int p) { node[id].s.insert(ind); if (p == -1) return; if (x&(1<<p)) { if (node[id].rc == 0) { P++; node[id].rc = P; node.push_back(temp); } add(node[id].rc, ind, x, p-1); } else { if (node[id].lc == 0) { P++; node[id].lc = P; node.push_back(temp); } add(node[id].lc, ind, x, p-1); } return; } int get(int id, int l, int r, int x, int p) { if (p == -1) return 0; bool bl = 0, br = 0; auto it = node[node[id].lc].s.lower_bound(l); if (it != node[node[id].lc].s.end() and (*it) <= r) bl = 1; auto it2 = node[node[id].rc].s.lower_bound(l); if (it2 != node[node[id].rc].s.end() and (*it2) <= r) br = 1; if (x&(1<<p)) { if (bl) return get(node[id].lc, l, r, x, p-1) + (1<<p); return get(node[id].rc, l, r, x, p-1); } else { if (br) return get(node[id].rc, l, r, x, p-1) + (1<<p); return get(node[id].lc, l, r, x, p-1); } } }tr; int main() { IOS; cin.tie(0); cout.tie(0); int u, v, q, n= 1; cin >> q; FOR(i, 1, q) { string type; cin >> type >> u >> v; if (type[0] == 'Q') { qu[i] = mp(1, mp(u, v)); } else { n++; qu[i] = mp(0, mp(u, n)); a[u].push_back(n); a[n].push_back(u); w[n] = w[u]^v; } } dfs(1); tr.node.push_back(tr.temp); tr.node.push_back(tr.temp); tr.add(1, 1, 0, 30); FOR(i, 1, q) { if (qu[i].first) { cout << tr.get(1, st[qu[i].second.second], ft[qu[i].second.second], w[qu[i].second.first], 30) << "\n"; } else tr.add(1, st[qu[i].second.second], w[qu[i].second.second], 30); } 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...