Submission #755428

#TimeUsernameProblemLanguageResultExecution timeMemory
755428drdilyorBall Machine (BOI13_ballmachine)C++17
100 / 100
142 ms24492 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int inf = 1e9;
const ll infl = 1e18;

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, q;
    cin >> n >> q;

    vector<vector<int>> child(n);
    vector par(n, 0);
    int root = -1;
    for (int i = 0; i < n; i++) {
        cin >> par[i];
        par[i]--;
        if (~par[i])
            child[par[i]].push_back(i);
        else root = i;
    }

    vector mn(n, inf);
    auto dfs = [&](auto& dfs, int i) -> void {
        mn[i] = i;
        for (int e : child[i]) {
            dfs(dfs, e);
            mn[i] = min(mn[i], mn[e]);
        }
        sort(child[i].begin(), child[i].end(), [&](auto a, auto b) { return mn[a] < mn[b]; });
    };

    dfs(dfs, root);

    int t = 0;
    vector<int> tout(n), id(n);

    auto dfs_ord = [&](auto& dfs_ord, int i)->void {
        for (int e : child[i]) {
            dfs_ord(dfs_ord, e);
        }
        id[t] = i;
        tout[i] = t++;
    };

    dfs_ord(dfs_ord, root);

    vector jmp(20, vector(n, -1));
    jmp[0] = par;
    for (int j = 1; j < 20; j++) {
        for (int i = 0; i < n; i++) {
            if (jmp[j-1][i] !=-1)
                jmp[j][i] = jmp[j-1][jmp[j-1][i]];
        }
    }

    vector has(n, 0);

    while (q--) {
        int t, k;
        cin >> t >> k;
        if (t == 1) {
            for (int i = 0; i < n; i++) {
                if (has[i]) continue;
                has[i] = 1;
                if (--k == 0) {
                    cout << id[i]+1 << '\n';
                    break;
                }
            }
        } else {
            k--;
            int cnt = 0;
            int i = k;
            for (int j = 19; j >= 0; j--) {
                if (jmp[j][i] != -1 && has[tout[jmp[j][i]]]) {
                    cnt += 1 << j;
                    i = jmp[j][i];
                }
            }
            has[tout[i]] = 0;
            cout << cnt << '\n';
        }
    }


    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...