Submission #467877

#TimeUsernameProblemLanguageResultExecution timeMemory
467877JasperLBall Machine (BOI13_ballmachine)C++14
16.11 / 100
384 ms21952 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

#define maxn 100005
#define maxh 20

int n, q, rt;
vector<int> e[maxn];
int jump[maxn][maxh];
vector<int> pos;
int idx[maxn];
priority_queue<pair<int,int>> pq;

bool ball[maxn];

void dfs(int i) {
    for (int j : e[i]) dfs(j);
    pos.push_back(i);
}

void add() {
    auto z = pq.top(); pq.pop();
    int i = z.second;
    ball[i] = true;
    //cout << i + 1 << endl;
}

int rem(int i) {
    int z = 0;
    for (int j = maxh-1; j >= 0; j--) {
        if (jump[i][j] == -1 || ball[jump[i][j]] == false) continue;
        z += (1<<j); i = jump[i][j];
    }
    ball[i] = false;
    pq.push({-idx[i],i});
    return z;
}

int main() {
    cin >> n >> q;
    for (int i = 0; i < n; i++) {
        cin >> jump[i][0]; jump[i][0]--;
        if (jump[i][0] != -1) e[jump[i][0]].push_back(i);
        else rt = i;
    }
    for (int i = 0; i < n; i++) sort(e[i].begin(),e[i].end());
    for (int j = 1; j < maxh; j++) {
        for (int i = 0; i < n; i++) {
            if (jump[i][j-1] == -1) jump[i][j] = -1;
            else jump[i][j] = jump[jump[i][j-1]][j-1];
        }
    }
    dfs(rt);
    //for (int j : pos) cout << j+1 << " ";
    //cout << endl;
    for (int i = 0; i < n; i++) idx[pos[i]] = i;
    for (int i = 0; i < n; i++) {
        pq.push({-idx[i],i});
    }
    for (int i = 0; i < q; i++) {
        int t; cin >> t;
        if (t == 1) {
            int sz; cin >> sz;
            for (int j = 0; j < sz-1; j++) add();
            int j = pq.top().second;
            cout << j + 1 << endl;
            add();
        } else {
            int j; cin >> j; j--;
            int res = rem(j);
            cout << res << endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...