Submission #1014763

#TimeUsernameProblemLanguageResultExecution timeMemory
1014763phoenixBall Machine (BOI13_ballmachine)C++17
100 / 100
141 ms26588 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 100100;

int n, q;
vector<int> g[N];
int par[N][17], mn[N];

void precalc(int s, int p) {
    par[s][0] = p;
    for (int i = 1; i < 17; i++) 
        par[s][i] = par[par[s][i - 1]][i - 1];
    mn[s] = s;
    for (int to : g[s]) if (to != p) {
        precalc(to, s);
        mn[s] = min(mn[s], mn[to]);
    }
}


int ord[N], num[N], T;

void numerate(int s) {
    sort(g[s].begin(), g[s].end(), [&](int u, int v) { return mn[u] < mn[v]; });
    for (int to : g[s]) if (to != par[s][0]) {
        numerate(to);
    }
    ord[s] = T;
    num[T] = s;
    T++;
}

int root;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        int p;
        cin >> p;
        if (!p) root = i;
        else g[p].push_back(i);
    }
    precalc(root, 0);
    numerate(root);

    set<int> st;
    bool us[n + 1] = {};
    for (int i = 1; i <= n; i++) 
        st.insert(ord[i]);

    while (q--) {
        int t;
        cin >> t;
        if (t == 1) {
            int k, x;
            cin >> k;
            while (k --> 0) {
                x = num[*st.begin()];
                st.erase(st.begin());
                us[x] = true;
            }
            cout << x << '\n';
        } else {
            int x, d = 0;
            cin >> x;
            for (int i = 16; i >= 0; i--) {
                if (us[par[x][i]]) {
                    x = par[x][i];
                    d += (1 << i);
                }
            }
            us[x] = false;
            st.insert(ord[x]);
            cout << d << '\n';
        }
    }
}

Compilation message (stderr)

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:66:26: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
   66 |             cout << x << '\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...