이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
typedef long long int ll;
typedef pair<int, int> pii;
#define SZ(x) (int) x.size()
#define F first
#define S second
#define lc id << 1
#define rc lc | 1
const int N = 2e5 + 10;
struct Node {
int ptr; vector<int> trie[2];
void add(ll x) {
int v = 0;
for (int i = 30; i >= 0; i--) {
int b = bool(x & (1 << i));
if (!trie[b][v]) trie[b][v] = ptr++;
v = trie[b][v];
}
}
ll get(ll x) {
if (ptr == 1) return 0;
int v = 0; ll res = 0;
for (int i = 30; i >= 0; i--) {
int b = bool(x & (1 << i));
if (trie[!b][v]) v = trie[!b][v], res += 1 << i;
else v = trie[b][v];
}
return res;
}
};
int type[N], X[N], Y[N], St[N], Ft[N], n = 1, q, tim; ll H[N];
vector<pii> adj[N]; Node seg[N << 2];
void DFS(int v, int p = -1) {
St[v] = tim++;
for (pii u : adj[v]) {
if (u.F != p) {
H[u.F] = H[v] ^ u.S;
DFS(u.F, v);
}
}
Ft[v] = tim;
}
void build(int id = 1, int l = 0, int r = tim) {
seg[id].ptr = 1;
seg[id].trie[0].resize((r - l + 2) * 30, 0);
seg[id].trie[1].resize((r - l + 2) * 30, 0);
if (r - l == 1) return;
int mid = (l + r) >> 1;
build(lc, l, mid);
build(rc, mid, r);
}
void add(int pos, ll x, int id = 1, int l = 0, int r = tim) {
seg[id].add(x);
if (r - l == 1) return;
int mid = (l + r) >> 1;
if (pos < mid) add(pos, x, lc, l, mid);
else add(pos, x, rc, mid, r);
}
ll get(int ql, int qr, ll x, int id = 1, int l = 0, int r = tim) {
if (qr <= l || r <= ql) return 0;
if (ql <= l && r <= qr) return seg[id].get(x);
int mid = (l + r) >> 1;
return max(get(ql, qr, x, lc, l, mid), get(ql, qr, x, rc, mid, r));
}
int main() {
scanf("%d", &q);
for (int i = 1; i <= q; i++) {
string t;
cin >> t >> X[i] >> Y[i];
if (t == "Add") {
type[i] = 0;
adj[X[i]].push_back({++n, Y[i]});
} else {
type[i] = 1;
}
}
DFS(1);
build();
add(0, 0);
n = 1;
for (int i = 1; i <= q; i++) {
if (type[i]) {
printf("%lld\n", get(St[Y[i]], Ft[Y[i]], H[X[i]]));
} else {
n++;
add(St[n], H[n]);
}
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
klasika.cpp: In function 'int main()':
klasika.cpp:79:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
79 | scanf("%d", &q);
| ~~~~~^~~~~~~~~~
# | 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... |