#include <bits/stdc++.h>
using namespace std;
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 998244353;
const ll LOGN = 20;
const ll MAXN = 2e5 + 5;
vector<pair<int,pair<int,int>>> queries;
vector<vector<int>> graph;
vector<set<int>> sets;
vector<int> val;
int tin[MAXN], tout[MAXN];
struct Node {
Node *to[2];
int id;
Node () {
to[0] = NULL;
to[1] = NULL;
}
};
int T = 0;
void dfs(int node, int parent) {
tin[node] = ++T;
for (auto u : graph[node])
dfs(u, node);
tout[node] = T;
}
bool check(Node *node, int subtree) {
int st = tin[subtree];
int en = tout[subtree];
auto u = sets[node->id].lower_bound(st);
if (u == sets[node->id].end() || *u > en)
return false;
return true;
}
int solve(Node *node, int subtree, int val) {
int ans = 0;
for (int i = 31; i >= 0; i--) {
bool bit = ((1<<i) & val) != 0;
if (node->to[!bit] != NULL && check(node->to[!bit], subtree)) {
ans += (1<<i);
node = node->to[!bit];
} else if (node->to[bit] != NULL && check(node->to[bit], subtree))
node = node->to[bit];
else
return 0;
}
return ans;
}
int main() {
fast
int Q;
cin >> Q;
queries = vector<pair<int,pair<int,int>>>(Q);
graph = vector<vector<int>>(Q+5, vector<int>());
val = vector<int>(Q+5, 0);
int nodes = 1, a, b;
string type;
for (int i = 0; i < Q; i++) {
cin >> type >> a >> b;
if (type == "Add") {
nodes++;
val[nodes] = (val[a] ^ b);
queries[i] = make_pair(1, make_pair(nodes, val[nodes]));
graph[a].push_back(nodes);
} else
queries[i] = make_pair(0, make_pair(a, b));
}
dfs(1, 1);
sets = vector<set<int>>(50*nodes, set<int>());
Node *root = new Node();
root->id = 1;
int ids = 1;
Node *now2 = root;
sets[now2->id].insert(1);
for (int i = 31; i >= 0; i--) {
bool bit = 0;
if (now2->to[bit] == NULL) {
now2->to[bit] = new Node();
now2->to[bit]->id = ++ids;
}
now2 = now2->to[bit];
sets[now2->id].insert(1);
}
for (auto u : queries) {
if (u.f) {
Node *now = root;
sets[now->id].insert(tin[u.s.f]);
int x = u.s.s;
for (int i = 31; i >= 0; i--) {
bool bit = ((1<<i) & x) != 0;
if (now->to[bit] == NULL) {
now->to[bit] = new Node();
now->to[bit]->id = ++ids;
}
now = now->to[bit];
sets[now->id].insert(tin[u.s.f]);
}
} else {
int node = u.s.f;
int subtree = u.s.s;
Node *now = root;
cout << solve(now, subtree, val[node]) << "\n";
}
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
1 ms |
856 KB |
Output is correct |
3 |
Correct |
1 ms |
860 KB |
Output is correct |
4 |
Correct |
1 ms |
1116 KB |
Output is correct |
5 |
Correct |
1 ms |
604 KB |
Output is correct |
6 |
Correct |
1 ms |
604 KB |
Output is correct |
7 |
Correct |
1 ms |
860 KB |
Output is correct |
8 |
Correct |
1 ms |
1116 KB |
Output is correct |
9 |
Correct |
1 ms |
604 KB |
Output is correct |
10 |
Correct |
1 ms |
860 KB |
Output is correct |
11 |
Correct |
1 ms |
860 KB |
Output is correct |
12 |
Correct |
1 ms |
968 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
1 ms |
856 KB |
Output is correct |
3 |
Correct |
1 ms |
860 KB |
Output is correct |
4 |
Correct |
1 ms |
1116 KB |
Output is correct |
5 |
Correct |
1 ms |
604 KB |
Output is correct |
6 |
Correct |
1 ms |
604 KB |
Output is correct |
7 |
Correct |
1 ms |
860 KB |
Output is correct |
8 |
Correct |
1 ms |
1116 KB |
Output is correct |
9 |
Correct |
1 ms |
604 KB |
Output is correct |
10 |
Correct |
1 ms |
860 KB |
Output is correct |
11 |
Correct |
1 ms |
860 KB |
Output is correct |
12 |
Correct |
1 ms |
968 KB |
Output is correct |
13 |
Correct |
4 ms |
2396 KB |
Output is correct |
14 |
Correct |
5 ms |
4188 KB |
Output is correct |
15 |
Correct |
6 ms |
6236 KB |
Output is correct |
16 |
Correct |
7 ms |
7772 KB |
Output is correct |
17 |
Correct |
4 ms |
2396 KB |
Output is correct |
18 |
Correct |
5 ms |
4104 KB |
Output is correct |
19 |
Correct |
7 ms |
5980 KB |
Output is correct |
20 |
Correct |
8 ms |
7740 KB |
Output is correct |
21 |
Correct |
4 ms |
2392 KB |
Output is correct |
22 |
Correct |
6 ms |
4188 KB |
Output is correct |
23 |
Correct |
7 ms |
5976 KB |
Output is correct |
24 |
Correct |
8 ms |
7680 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
549 ms |
188200 KB |
Output is correct |
2 |
Correct |
1126 ms |
365596 KB |
Output is correct |
3 |
Runtime error |
1461 ms |
524288 KB |
Execution killed with signal 9 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
600 KB |
Output is correct |
2 |
Correct |
1 ms |
856 KB |
Output is correct |
3 |
Correct |
1 ms |
860 KB |
Output is correct |
4 |
Correct |
1 ms |
1116 KB |
Output is correct |
5 |
Correct |
1 ms |
604 KB |
Output is correct |
6 |
Correct |
1 ms |
604 KB |
Output is correct |
7 |
Correct |
1 ms |
860 KB |
Output is correct |
8 |
Correct |
1 ms |
1116 KB |
Output is correct |
9 |
Correct |
1 ms |
604 KB |
Output is correct |
10 |
Correct |
1 ms |
860 KB |
Output is correct |
11 |
Correct |
1 ms |
860 KB |
Output is correct |
12 |
Correct |
1 ms |
968 KB |
Output is correct |
13 |
Correct |
4 ms |
2396 KB |
Output is correct |
14 |
Correct |
5 ms |
4188 KB |
Output is correct |
15 |
Correct |
6 ms |
6236 KB |
Output is correct |
16 |
Correct |
7 ms |
7772 KB |
Output is correct |
17 |
Correct |
4 ms |
2396 KB |
Output is correct |
18 |
Correct |
5 ms |
4104 KB |
Output is correct |
19 |
Correct |
7 ms |
5980 KB |
Output is correct |
20 |
Correct |
8 ms |
7740 KB |
Output is correct |
21 |
Correct |
4 ms |
2392 KB |
Output is correct |
22 |
Correct |
6 ms |
4188 KB |
Output is correct |
23 |
Correct |
7 ms |
5976 KB |
Output is correct |
24 |
Correct |
8 ms |
7680 KB |
Output is correct |
25 |
Correct |
549 ms |
188200 KB |
Output is correct |
26 |
Correct |
1126 ms |
365596 KB |
Output is correct |
27 |
Runtime error |
1461 ms |
524288 KB |
Execution killed with signal 9 |
28 |
Halted |
0 ms |
0 KB |
- |