#define ll long long
#define ull unsigned long long
#include <bits/stdc++.h>
#define isz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define RF(name) if(fopen(name".INP", "r")) {freopen(name".INP", "r", stdin); freopen(name".INP", "w", stdout);}
using namespace std;
const int MaxN = 2e5 + 1;
int q, Tsize = 1, xorTo[MaxN], ans[MaxN];
vector <int> g[MaxN];
vector <pair <int, int>> queries[MaxN];
struct node {
int child[2], intime, val;
node() {
child[0] = child[1] = 0;
intime = 2e9;
val = -1;
}
};
struct {
vector <int> rootNodes;
vector <node> T;
void add_root() {
rootNodes.push_back(isz(T));
T.push_back(node());
}
void add(const int &n, int rootn, int cur_time) {
--rootn;
int p = rootNodes[rootn];
for(int i = 30; ~i; --i) {
bool t = (n >> i) & 1;
if(!T[p].child[t]) {
T[p].child[t] = isz(T);
T.push_back(node());
}
p = T[p].child[t];
T[p].intime = min(T[p].intime, cur_time);
}
T[p].val = n;
}
int max_xor(const int &n, int rootn, int cur_time) {
--rootn;
int p = rootNodes[rootn];
for(int i = 30; ~i; --i) {
bool t = (n >> i) & 1;
if(T[p].child[!t] && T[T[p].child[!t]].intime <= cur_time) {
p = T[p].child[!t];
}
else if(T[p].child[t] && T[T[p].child[t]].intime <= cur_time) {
p = T[p].child[t];
}
}
return n ^ T[p].val;
}
} trie;
void dfs_merge(int p1, int p2, int cur_bit) {
if(p1 == p2) return;
for(int i = 0; i < 2; ++i) if(trie.T[p2].child[i]) {
if(!trie.T[p1].child[i]) {
trie.T[p1].child[i] = trie.T[p2].child[i];
}
trie.T[trie.T[p1].child[i]].intime = min(trie.T[trie.T[p1].child[i]].intime, trie.T[trie.T[p2].child[i]].intime);
if(cur_bit) dfs_merge(trie.T[p1].child[i], trie.T[p2].child[i], cur_bit - 1);
}
}
void dfs(int v) {
for(int &x: g[v]) {
dfs(x);
dfs_merge(trie.rootNodes[v - 1], trie.rootNodes[x - 1], 30);
}
for(pair <int, int> &x: queries[v]) {
int &xor_val = x.first, &i = x.second;
ans[i] = trie.max_xor(xor_val, v, i);
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
memset(ans, -1, sizeof ans);
cin >> q;
trie.add_root();
trie.add(0, 1, -1);
for(int x, y, i = 0; i < q; ++i) {
string t; cin >> t >> x >> y;
if(t == "Add") {
++Tsize;
xorTo[Tsize] = xorTo[x] ^ y;
g[x].push_back(Tsize);
trie.add_root();
trie.add(xorTo[Tsize], Tsize, i);
}
else {
queries[y].push_back({xorTo[x], i});
}
}
dfs(1);
for(int i = 0; i < q; ++i) if(ans[i] >= 0) cout << ans[i] << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |