제출 #1360728

#제출 시각아이디문제언어결과실행 시간메모리
1360728f0rizenBall Machine (BOI13_ballmachine)C++20
7.54 / 100
1097 ms30700 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int inf = 1e9 + 7;
const ll infll = 1e18;

template<typename T>
istream &operator>>(istream &is, vector<T> &a) {
    for (auto &i : a) {
        is >> i;
    }
    return is;
}

struct BinaryJumps {
    static const int lg = 17;

    vector<int> d;
    vector<vector<int>> up;

    BinaryJumps() {}
    BinaryJumps(int n) {
        d.resize(n);
        up.resize(lg, vector<int>(n, -1));
    }

    void add_leaf(int v, int p) {
        d[v] = d[p] + 1;
        up[0][v] = p;
        for (int i = 1; i < lg; ++i) {
            if (up[i - 1][v] != -1) {
                up[i][v] = up[i - 1][up[i - 1][v]];
            }
        }
    }

    pair<int, int> la(int v, const function<bool(int)> &f) {
        int u = v;
        for (int i = lg - 1; i >= 0; --i) {
            if (up[i][u] == -1) {
                continue;
            }
            if (f(up[i][u])) {
                u = up[i][u];
            }
        }
        return {u, d[v] - d[u]};
    }
};

vector<vector<int>> g;
BinaryJumps tr;
vector<int> mn;
vector<int> tin, tout;
int timer = 0;

void dfs1(int v, int p = -1) {
    mn[v] = v;
    for (auto u : g[v]) {
        if (u != p) {
            dfs1(u, v);
            mn[v] = min(mn[v], mn[u]);
        }
    }
}

void dfs2(int v, int p = -1) {
    tin[v] = timer++;
    vector<int> ch;
    for (auto u : g[v]) {
        if (u != p) {
            ch.push_back(u);
        }
    }
    sort(ch.begin(), ch.end(), [&](int a, int b) {
        return mn[a] < mn[b];
    });
    for (auto u : ch) {
        tr.add_leaf(u, v);
        dfs2(u, v);
    }
    tout[v] = timer++;
}

int32_t main() {
#ifdef LOCAL
    freopen("/tmp/input.txt", "r", stdin);
#else
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    int n, q;
    cin >> n >> q;
    g.resize(n);
    int root = -1;
    for (int i = 0; i < n; ++i) {
        int p;
        cin >> p;
        --p;
        if (p == -1) {
            root = i;
        } else {
            g[p].push_back(i);
            g[i].push_back(p);
        }
    }
    mn.resize(n);
    dfs1(0);
    tr = BinaryJumps(n);
    tin.resize(n);
    tout.resize(n);
    dfs2(0);
    vector<bool> mark(n);
    set<pair<int, int>> st;
    for (int i = 0; i < n; ++i) {
        st.insert({tout[i], i});
    }
    while (q--) {
        int t;
        cin >> t;
        if (t == 1) {
            int k;
            cin >> k;
            int last = -1;
            while (k > 0) {
                auto [_, v] = *st.begin();
                st.erase(st.begin());
                last = v;
                mark[v] = 1;
                --k;
            }
            cout << last + 1 << "\n";
        } else {
            int v;
            cin >> v;
            --v;
            auto [u, d] = tr.la(v, [&](int v) {
                return mark[v];
            });
            mark[u] = 0;
            st.insert({tout[u], u});
            cout << d << "\n";
        }
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…