제출 #1203613

#제출 시각아이디문제언어결과실행 시간메모리
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...