제출 #336471

#제출 시각아이디문제언어결과실행 시간메모리
336471parsabahramiKlasika (COCI20_klasika)C++17
33 / 110
1012 ms524292 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...