제출 #239113

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

const int N = 1e5 + 1;
const int K = 19;

int n,q,root,t;
vector<int> adj[N];
int dp[K][N],lv[N],mn[N],prio[N];
priority_queue<pair<int,int> > ava;
vector<pair<int,int> > tmp;
bool filled[N];

void dfs(int u,int p)
{
    lv[u] = lv[p]+1,dp[0][u] = p;
    mn[u] = u;
    for(int v : adj[u]) dfs(v,u),mn[u] = min(mn[u],mn[v]);
    tmp.clear();
    for(int v : adj[u]) tmp.push_back({mn[v],v});
    sort(tmp.begin(),tmp.end());
    int id = 0;
    for(int &v : adj[u]) v = tmp[id++].second;
}

void findpr(int u,int p)
{
    for(int v : adj[u]) findpr(v,u);
    prio[u] = ++t;
}

int jump(int x)
{
    for(int i = K-1;i >= 0;i--) if(filled[dp[i][x]])
    {
        x = dp[i][x];
        if(!filled[dp[0][x]]) return x;
    }
    return x;
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n >> q;
    for(int i = 1;i <= n;i++) 
    {
        int x;
        cin >> x;
        if(!x) root = i;
        else adj[x].push_back(i);
    }
    dfs(root,0);
    findpr(root,0);
    for(int i = 1;i < K;i++) for(int j = 1;j <= n;j++) dp[i][j] = dp[i-1][dp[i-1][j]];
    for(int i = 1;i <= n;i++) ava.push({-prio[i],i});
    while(q--)
    {
        int t,x;
        cin >> t >> x;
        if(t==1)
        {
            int ans;
            while(x--) ans = ava.top().second,filled[ava.top().second] = true,ava.pop();            
            cout << ans << '\n';
        }
        else
        {
            int res = jump(x);
            filled[res] = false,ava.push({-prio[res],res});
            cout << lv[x]-lv[res] << '\n';
        }
    }
}

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

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