Submission #857071

#TimeUsernameProblemLanguageResultExecution timeMemory
857071JethroKlasika (COCI20_klasika)C++17
0 / 110
267 ms121440 KiB
//Writed by: Jethro_ //---------------------- #include <bits/stdc++.h> using namespace std; #define fi first #define se second const int N = 1e6 + 10; int n, node = 1, i, root, val, in[N], out[N], cnt = 0, Xor[N], LG = 31, child[N][2], cnt2 = 0; vector<pair<int, int>> a[N]; vector<int> save[N]; pair<int, int> query[N]; string type[N]; void add() { cin >> n; for(i = 1; i <= n; ++i) { cin >> type[i]; if(type[i] == "Add") { cin >> root >> val; a[++node].push_back({root, val}); a[root].push_back({node, val}); query[i] = {node, node}; }else { cin >> root >> val; query[i] = {root, val}; } } } void dfs(int u, int p) { in[u] = ++cnt; for(auto [v, w] : a[u]) { if(v == p) continue; Xor[v] = Xor[u] ^ w; dfs(v, u); } out[u] = cnt; } void ADD(int s, int id) { int u = 0; for(int i = LG; i >= 0; --i) { int k = (s >> i) & 1; if(child[u][k] == -1) { child[u][k] = ++cnt2; } u = child[u][k]; save[u].push_back(in[id]); } } void get(int s, int l, int r) { int u = 0, res = 0; for(int i = LG; i >= 0; --i) { int k = (s >> i) & 1, t = child[u][k ^ 1]; int x = lower_bound(save[t].begin(), save[t].end(), l) - save[t].begin(), y = upper_bound(save[t].begin(), save[t].end(), r) - save[t].begin() - 1; if(child[u][k ^ 1] != -1 && x <= y){ u = child[u][k ^ 1]; res += (1 << i); }else { u = child[u][k]; } } cout << res << '\n'; } void solve() { memset(child, -1, sizeof child); dfs(1, 0); for(i = 1; i <= n; ++i) { auto [x, y] = query[i]; if(type[i] == "Add") { ADD(Xor[x], y); }else { int now = Xor[x]; get(now, in[y], out[y]); } } } int main() { cin.tie(NULL); ios_base::sync_with_stdio(false); add(); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...