Submission #1172397

#TimeUsernameProblemLanguageResultExecution timeMemory
1172397VMaksimoski008Ball Machine (BOI13_ballmachine)C++20
100 / 100
253 ms34236 KiB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;

struct fenwick {
    int n;
    vector<int> tree;
    fenwick(int _n) : n(_n+10), tree(n+50) {}

    void update(int p, int v) {
        for(p++; p<n; p+=p&-p) tree[p] += v;
    }

    int query(int p) {
        int ans = 0;
        for(p++; p; p-=p&-p) ans += tree[p];
        return ans;
    }
};

int n, q, up[maxn][20], root, timer=1, in[maxn], id[maxn], out[maxn], mn[maxn];
vector<int> G[maxn], ord;

void dfs(int u) {
    in[u] = timer++;
    for(int i=1; i<20; i++) up[u][i] = up[up[u][i-1]][i-1];
    mn[u] = u;
    for(int v : G[u]) {
        up[v][0] = u;
        dfs(v);
        mn[u] = min(mn[u], mn[v]);
    }
    out[u] = timer++;
}

void dfs2(int u) {
    vector<pair<int, int> > ch;
    for(int v : G[u]) ch.push_back({ mn[v], v });
    sort(ch.begin(), ch.end());
    for(auto [_, v] : ch) dfs2(v);
    ord.push_back(u);
    id[u] = ord.size() - 1;
}

signed main() {
    cin >> n >> q;
    for(int i=1; i<=n; i++) {
        int p; cin >> p;
        if(!p) root = i;
        else G[p].push_back(i);
    }

    dfs(root);
    dfs2(root);

    set<int> st;
    for(int i=0; i<n; i++) st.insert(i);

    fenwick fwt(2*n);
    while(q--) {
        int t, u; cin >> t >> u;

        if(t == 1) {
            int last = 0;
            for(int i=0; i<u; i++) {
                int p = *st.begin();
                st.erase(p);
                last = ord[p];
                fwt.update(in[ord[p]], 1);
                fwt.update(out[ord[p]], -1);
            }
            cout << last << '\n';
        } else {
            cout << fwt.query(in[u]) - 1 << '\n';
            for(int i=19; i>=0; i--) {
                if(!up[u][i]) continue;
                if(fwt.query(in[up[u][i]])) u = up[u][i];
            }
            st.insert(id[u]);
            fwt.update(in[u], -1);
            fwt.update(out[u], 1);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...