Submission #830012

#TimeUsernameProblemLanguageResultExecution timeMemory
830012vjudge1Ball Machine (BOI13_ballmachine)C++17
100 / 100
141 ms24140 KiB
#include <bits/stdc++.h>
using namespace std;

/// 123

int32_t main() {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        int n, q;
        cin >> n >> q;
        n++;
        vector<vector<int>> adj(n);
        for (int i = 1; i < n; i++) {
                int p;
                cin >> p;
                adj[p].emplace_back(i);
        }
        int lg = __lg(n);
        vector<vector<int>> up(lg + 1, vector<int>(n, 0));
        vector<int> f(n);
        function<void(int, int)> dfs = [&](int u, int p) {
                up[0][u] = p;
                f[u] = u;
                for (int i = 1; i <= lg; i++) up[i][u] = up[i - 1][up[i - 1][u]];
                for (int v : adj[u]) {
                        dfs(v, u);
                        f[u] = min(f[u], f[v]);
                }
        };
        dfs(0, 0);
        vector<int> ord(n);
        int time = 0;
        function<void(int)> dfso = [&](int u) {
                sort(adj[u].begin(), adj[u].end(), [&](int i, int j) {
                        return f[i] < f[j];
                });
                for (int v : adj[u]) {
                        dfso(v);
                }
                ord[u] = time++;
        };
        dfso(0);
        auto cmp = [&](int i, int j) {
                return ord[i] > ord[j];
        };
        priority_queue<int, vector<int>, decltype(cmp)> pq(cmp);
        for (int i = 0; i < n; i++) pq.emplace(i);
        vector<int> ball(n, 0);
        while (q--) {
                int _, k;
                cin >> _ >> k;
                if (_ == 1) {
                        int res = 0;
                        while (k--) {
                                res = pq.top();
                                pq.pop();
                                ball[res] ^= 1;
                        }
                        cout << res << '\n';
                } else {
                        ball[k] ^= 1;
                        int u = k, res = 0;
                        for (int i = lg; i >= 0; i--) {
                                if (ball[up[i][u]]) u = up[i][u], res += 1 << i;
                        }
                        ball[k] ^= 1;
                        ball[u] ^= 1;
                        pq.emplace(u);
                        cout << res << '\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...