Submission #547254

#TimeUsernameProblemLanguageResultExecution timeMemory
547254JomnoiBall Machine (BOI13_ballmachine)C++17
75.90 / 100
1086 ms22092 KiB
#include <bits/stdc++.h>
#define DEBUG 0
using namespace std;

const int MAX_N = 1e5 + 10;

int timer;
vector <int> graph[MAX_N];
int depth[MAX_N], parent[MAX_N][20];
int minimum[MAX_N];
int st[MAX_N], pos[MAX_N];
bool state[MAX_N];
bool tree[4 * MAX_N];

int get_min(int u) {
    minimum[u] = u;
    for(auto v : graph[u]) {
        depth[v] = depth[u] + 1;
        minimum[u] = min(minimum[u], get_min(v));
    }
    return minimum[u];
}

void postorder(int u) {
    for(auto v : graph[u]) {
        postorder(v);
    }
    timer++;
    st[u] = timer;
    pos[timer] = u;
}

int jump(int u, int k) {
    for(int i = 0; i < 20; i++) {
        if(k & (1<<i)) {
            u = parent[u][i];
        }
    }
    return u;
}

void update(int idx, int l, int r, int q, bool v) {
    if(l == r) {
        tree[idx] = v;
        return;
    }

    int mid = (l + r) / 2;
    if(q <= mid) {
        return void(update(idx * 2, l, mid, q, v));
    }
    update(idx * 2 + 1, mid + 1, r, q, v);
    tree[idx] = tree[idx * 2] & tree[idx * 2 + 1];
}

int query(int idx, int l, int r) {
    if(l == r) {
        return l;
    }

    int mid = (l + r) / 2;
    if(tree[idx * 2] == false) {
        return query(idx * 2, l, mid);
    }
    return query(idx * 2 + 1, mid + 1, r);
}

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

    int root = 1;
    for(int i = 1; i <= N; i++) {
        cin >> parent[i][0];
        graph[parent[i][0]].push_back(i);
        if(parent[i][0] == 0) {
            root = i;
        }
    }

    get_min(root);
    for(int i = 1; i <= N; i++) {
        sort(graph[i].begin(), graph[i].end(), [&](const int &a, const int &b) {
            return minimum[a] < minimum[b];
        });
    }

    postorder(root);
    depth[0] = -1;
    for(int j = 1; j < 20; j++) {
        for(int i = 1; i <= N; i++) {
            parent[i][j] = parent[parent[i][j - 1]][j - 1];
        }
    }

    while(Q--) {
        int t, idx;
        cin >> t;
        if(t == 1) {
            int k;
            cin >> k;
            while(k > 0) {
                idx = query(1, 1, N);

                while(k > 0 and state[pos[idx]] == false) {
                    state[pos[idx]] = true;
                    update(1, 1, N, idx, true);
                    k--;
                    if(k > 0) {
                        idx++;
                    }
                }
            }
            cout << pos[idx] << '\n';
        }
        else {
            int x;
            cin >> x;
            int l = 0, r = depth[x], res;
            while(l <= r) {
                int mid = (l + r) / 2;

                if(state[jump(x, mid)] == true) {
                    res = mid;
                    l = mid + 1;
                }
                else {
                    r = mid - 1;
                }
            }
            cout << res << '\n';
            
            idx = jump(x, res);
            state[idx] = false;
            update(1, 1, N, st[idx], false);
        }
    }
    return 0;
}

Compilation message (stderr)

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:132:28: warning: 'res' may be used uninitialized in this function [-Wmaybe-uninitialized]
  132 |             cout << res << '\n';
      |                            ^~~~
ballmachine.cpp:115:33: warning: 'idx' may be used uninitialized in this function [-Wmaybe-uninitialized]
  115 |             cout << pos[idx] << '\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...