Submission #1203613

#TimeUsernameProblemLanguageResultExecution timeMemory
1203613HanksburgerKlasika (COCI20_klasika)C++20
110 / 110
2922 ms65572 KiB
#include <bits/stdc++.h> using namespace std; int a[200005], tin[200005], tout[200005], n=1, q, t; vector<pair<int, pair<int, int> > > vec; vector<pair<int, int> > adj[200005]; struct node { node *lc, *rc; int l, r; vector<int> v; node(int l, int r) : lc(0), rc(0), l(l), r(r) {} } *root; void build(node *i) { if (i->l==i->r) return; int mid=(i->l+i->r)/2; build(i->lc=new node(i->l, mid)); build(i->rc=new node(mid+1, i->r)); } void update(node *i, int x, int y) { i->v.push_back(y); if (i->l==i->r) return; int mid=(i->l+i->r)/2; update(x<=mid?i->lc:i->rc, x, y); } int query(node *i, int ql, int qr, int x) { if (ql<=i->l && i->r<=qr) { int mx=0; for (int u:i->v) mx=max(mx, x^u); return mx; } int mid=(i->l+i->r)/2, mx=0; if (i->l<=qr && ql<=mid) mx=max(mx, query(i->lc, ql, qr, x)); if (mid<qr && ql<=i->r) mx=max(mx, query(i->rc, ql, qr, x)); return mx; } void dfs(int u) { tin[u]=++t; for (int i=0; i<adj[u].size(); i++) { int v=adj[u][i].first, w=adj[u][i].second; a[v]=a[u]^w; dfs(v); } tout[u]=t; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> q; for (int i=0; i<q; i++) { string str; int x, y; cin >> str >> x >> y; if (str=="Add") { adj[x].push_back({++n, y}); vec.push_back({1, {n, y}}); } else vec.push_back({0, {x, y}}); } dfs(1); for (int i=1; i<=n; i++) adj[i].clear(); build(root=new node(1, n)); update(root, 1, 0); for (int i=0; i<q; i++) { if (vec[i].first) update(root, tin[vec[i].second.first], a[vec[i].second.first]); else cout << query(root, tin[vec[i].second.second], tout[vec[i].second.second], a[vec[i].second.first]) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...