Submission #1306605

#TimeUsernameProblemLanguageResultExecution timeMemory
1306605DangKhoizzzzKlasika (COCI20_klasika)C++20
110 / 110
612 ms193164 KiB
#include <bits/stdc++.h> #define fi first #define se second #define pii pair <int , int> #define BIT(x, k) ((x >> k) & 1) using namespace std; const int maxn = 2e5 + 7; const int MAX_NODES = maxn * 32; struct info { string t; int c1, c2; } query[maxn]; struct node { int c[2]; vector<pair<int, int>> pos; node() { c[0] = c[1] = -1; } }; vector<node> trie; void init_trie() { trie.reserve(MAX_NODES); trie.push_back(node()); } void add(int x, int p, int time_id) { int cur = 0; trie[cur].pos.push_back({p, time_id}); for(int i = 30; i >= 0; i--) { int b = BIT(x, i); if(trie[cur].c[b] == -1) { trie[cur].c[b] = trie.size(); trie.push_back(node()); } cur = trie[cur].c[b]; trie[cur].pos.push_back({p, time_id}); } } bool check(const vector<pair<int,int>>& v, int l, int r, int current_time) { auto it = lower_bound(v.begin(), v.end(), make_pair(l, -1)); for (; it != v.end() && it->first <= r; ++it) { if (it->second <= current_time) return true; } return false; } int ask(int x, int l, int r, int current_time) { int res = 0, cur = 0; for(int i = 30; i >= 0; i--) { int f = (1 ^ BIT(x, i)); int cf = trie[cur].c[f]; if(cf != -1 && !trie[cf].pos.empty() && check(trie[cf].pos, l, r, current_time)) { res ^= (1 << i); cur = cf; } else { cur = trie[cur].c[f ^ 1]; if (cur == -1) return res; } } return res; } int pre[maxn], q, n = 1, tin[maxn], tout[maxn], time_dfs = 0; vector <int> g[maxn]; void dfs(int u) { tin[u] = ++time_dfs; for(int v: g[u]) dfs(v); tout[u] = time_dfs; } void solve() { cin >> q; vector<tuple<int, int, int>> add_ops; for(int i = 1; i <= q; i++) { cin >> query[i].t >> query[i].c1 >> query[i].c2; if(query[i].t == "Add") { auto [t, x, y] = query[i]; n++; g[x].push_back(n); pre[n] = (pre[x] ^ y); add_ops.emplace_back(n, i, pre[n]); } } dfs(1); init_trie(); add(0, tin[1], 0); for(auto& op : add_ops) { add(get<2>(op), tin[get<0>(op)], get<1>(op)); } for(auto &node : trie) { sort(node.pos.begin(), node.pos.end()); } int cnt_add = 0; for(int i = 1; i <= q; i++) { if(query[i].t == "Add") { } else { cout << ask(pre[query[i].c1], tin[query[i].c2], tout[query[i].c2], i) << '\n'; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); 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...