Submission #559765

#TimeUsernameProblemLanguageResultExecution timeMemory
559765hoanghq2004Ball Machine (BOI13_ballmachine)C++14
0 / 100
117 ms15668 KiB
#include <bits/stdc++.h>

using namespace std;

int n, q;
vector <int> e[100010];
int ti, pos[100010], ord[100010];
int minc[100010];

void dfs1(int u) {
    minc[u] = n + 1;
    for (auto v: e[u]) {
        dfs1(v);
        if (minc[v] < minc[u]) {
            minc[u] = minc[v];
        }
    }
    minc[u] = min(minc[u], u);
}

void dfs2(int u) {
    ord[ti] = u;
    pos[u] = ti--;
    for (auto v: e[u]) dfs2(v);
}

int st[400010];

void update(int id, int l, int r, int i, int val) {
    if (i > r || i < l) return;
    if (l == r) {
        st[id] = 1;
        return;
    }
    int mid = l + r >> 1;
    update(id * 2, l, mid, i, val);
    update(id * 2 + 1, mid + 1, r, i, val);
    st[id] = min(st[id * 2], st[id * 2 + 1]);
}

int get(int id, int l, int r) {
    if (l == r) return l;
    int mid = l + r >> 1;
    if (st[id * 2] == 0) return get(id * 2, l, mid);
    else return get(id * 2 + 1, mid + 1, r);
}

int cmp(int u, int v) {
    return minc[u] > minc[v];
}

int main() {
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; ++i) {
        int p;
        scanf("%d", &p);
        e[p].push_back(i);
    }
    ti = n;
    dfs1(e[0].front());
    for (int u = 1; u <= n; ++u)
        sort(e[u].begin(), e[u].end(), cmp);
    dfs2(e[0].front());
//    for (int i = 1; i <= n; ++i) cout << ord[i] << " ";
    while (q--) {
        int c, k;
        scanf("%d%d", &c, &k);
        if (c == 1) {
            int ans = 0;
            while (k--) {
                ans = get(1, 1, n);
                update(1, 1, n, ans, 1);
            }
            cout << ord[ans] << "\n";
        }
        else {
            update(1, 1, n, k, 0);
            cout << "0\n";
        }
    }
}

Compilation message (stderr)

ballmachine.cpp: In function 'void update(int, int, int, int, int)':
ballmachine.cpp:35:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   35 |     int mid = l + r >> 1;
      |               ~~^~~
ballmachine.cpp: In function 'int get(int, int, int)':
ballmachine.cpp:43:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   43 |     int mid = l + r >> 1;
      |               ~~^~~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:53:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
ballmachine.cpp:56:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |         scanf("%d", &p);
      |         ~~~~~^~~~~~~~~~
ballmachine.cpp:67:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |         scanf("%d%d", &c, &k);
      |         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...