제출 #1358016

#제출 시각아이디문제언어결과실행 시간메모리
1358016madamadam3Ball Machine (BOI13_ballmachine)C++20
0 / 100
14 ms16284 KiB
#include <bits/stdc++.h>
using namespace std;

struct Fenw {
    int n; vector<int> BIT;
    Fenw(int N = 0) : n(N), BIT(N, 0) {}
    void update(int r, int delta) {for (; r < n; r |= r+1) BIT[r] += delta;}
    void update(int l, int r, int delta) {update(l, delta); update(r+1, -delta);}
    int query(int i) {int res = 0; for (; i >= 0; i &= i+1, i--) res += BIT[i]; return res;}
};

const int MAXLOG = 18;

int n, q, timer = 0;
vector<vector<int>> G, up;
vector<int> order, pos, min_subtree, tin, tout;

void dfs1(int u, int p) {
    tin[u] = timer++;
    up[u][0] = p;
    for (int i = 1; i < MAXLOG; i++) {
        up[u][i] = up[up[u][i-1]][i-1];
    }

    min_subtree[u] = u;
    for (auto v : G[u]) {
        dfs1(v, u); min_subtree[u] = min(min_subtree[u], min_subtree[v]);
    }
    tout[u] = timer++;
}

void dfs2(int u) {
    sort(G[u].begin(), G[u].end(), [&](int i, int j) {return min_subtree[i] < min_subtree[j];});
    for (auto v : G[u]) {
        dfs2(v);
    }
    order.push_back(u); pos[u] = order.size()-1;
}

int f(int u, int x) {
    for (int i = 0; i < MAXLOG; i++) if (x & 1<<i) u = up[u][i];
    return u;
}

int main() {
    cin.tie(0)->sync_with_stdio(0);

    cin >> n >> q;
    G.assign(n, vector<int>()); up.assign(n, vector<int>(MAXLOG));
    min_subtree.assign(n, 1e9); tin.assign(n,0); tout.assign(n, 0); pos.assign(n, 0);

    for (int i = 0; i < n; i++) {
        int x; cin >> x; --x;
        if (i>0) G[x].push_back(i);
    }

    dfs1(0, 0);
    dfs2(0);

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    for (int i = 0; i < n; i++) pq.push({pos[i], i});

    auto fenw = Fenw(2*n+2);
    while (q--) {
        int t; cin >> t;
        if (t == 1) {
            int k; cin >> k;
            int l = 0;
            while (k--) {
                auto [p, u] = pq.top(); pq.pop();
                fenw.update(tin[u], tout[u], 1);
                l = u;
            }
            cout << l+1 << "\n";
        } else {
            int x; cin >> x;
            --x;

            int above = fenw.query(tin[x])-1;
            int v = f(x, above);
            fenw.update(tin[v], tout[v], -1);
            pq.push({pos[v], v});
            cout << above << "\n";
        }
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…