제출 #666838

#제출 시각아이디문제언어결과실행 시간메모리
666838pedroslreyBall Machine (BOI13_ballmachine)C++17
100 / 100
385 ms23484 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 10;
const int MAXK = 20;

vector<int> graph[MAXN];
int dp[MAXN][MAXK], prof[MAXN], mn[MAXN], xs[MAXN], redro[MAXN];
vector<int> order;
int seg[4*MAXN];

void dfs1(int u) {
    mn[u] = u;
    for (int v: graph[u]) {
        dfs1(v);
        mn[u] = min(mn[u], mn[v]);
    }
}

void dfs2(int u) {
    sort(graph[u].begin(), graph[u].end(), [&](int a, int b) { return mn[a] < mn[b]; });
    for (int v: graph[u]) {
        prof[v] = prof[u] + 1;
        dp[v][0] = u;
        for (int k = 1; k < MAXK; ++k)
            dp[v][k] = dp[dp[v][k-1]][k-1];
        dfs2(v);
    }
    redro[u] = order.size();
    order.push_back(u);
}

void update(int pos, int ini, int fim, int idx, int x) {
    if (ini == fim) {
        seg[pos] = x;
        return;
    }

    int m = (ini + fim)/2;
    if (idx <= m) update(2*pos, ini, m, idx, x);
    else update(2*pos + 1, m + 1, fim, idx, x);

    seg[pos] = min(seg[2*pos], seg[2*pos + 1]);
}

int bsearch(int pos, int ini, int fim) {
    if (ini == fim) return ini;

    int m = (ini + fim)/2;
    if (!seg[2*pos]) return bsearch(2*pos, ini, m);
    return bsearch(2*pos + 1, m + 1, fim);
}

int main() {
    int n, q;
    cin >> n >> q;

    for (int i = 1; i <= n; ++i) {
        int x;
        cin >> x;

        graph[x].push_back(i);
    }

    dfs1(0);
    dfs2(0);

    for (int qq = 0; qq < q; ++qq) {
        int t, x;
        cin >> t >> x;

        if (t == 1) {
            int pos;
            for (int i = 0; i < x; ++i) {
                pos = bsearch(1, 0, n);
                update(1, 0, n, pos, 1);
                xs[order[pos]] = 1;
            }
            cout << order[pos] << "\n";
        }
        else {
            int atual = x;
            for (int k = MAXK-1; k >= 0; --k)
                if (xs[dp[atual][k]]) atual = dp[atual][k];
            update(1, 0, n, redro[atual], 0);
            xs[atual] = 0;

            cout << prof[x] - prof[atual] << "\n";
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:80:30: warning: 'pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   80 |             cout << order[pos] << "\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...