Submission #30859

#TimeUsernameProblemLanguageResultExecution timeMemory
30859NavickBall Machine (BOI13_ballmachine)C++14
11.54 / 100
253 ms28308 KiB
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10 , LG = 20;
int par[LG][N] , h[N] , st[N] , tim = 0 , root = -1 , f[N] , en[N] , mini[N];
bool used[N];
vector<int > child[N];
set<pair<int,int> > s;

bool cmp(int a,int b){
    return mini[a] < mini[b];
}

void p_dfs(int v,int p=0){
    mini[v] = v;
    for(auto u:child[v]){
        if(u == p)continue;
        p_dfs(u , v);
        mini[v] = min(mini[v] , mini[u]);
    }
}


void dfs(int v , int p = 0){

    par[0][v] = p;
    for(int i=1;i<LG;i++)par[i][v] = par[i-1][par[i-1][v]];

    st[v] = tim++;
    for(auto u:child[v]){
        h[u] = h[v] + 1;
        dfs(u , v);
    }
    en[v] = tim;
}


int i_par(int v,int x){
    for(int i = LG - 1; i>=0 ; i--){
        if(x & (1<<i))v = par[i][v];
    }
    return v;
}
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    int n , q; cin>>n>>q;
    for(int i=1;i<=n;i++){
        int p; cin>>p;
        if(p == 0)root = i;
        else child[p].push_back(i);
    }

    p_dfs(root);

    for(int i=1;i<=n;i++)sort(child[i].begin() , child[i].end() , cmp);

    dfs(root);

    for(int i=1;i<=n;i++)s.insert({en[i] , -st[i]});

    for(int i=1;i<=n;i++)f[st[i]] = i;

    while(q--){
        int type; cin>>type;
        if(type == 1){
            int k , ind ; cin>>k;
            while(k--){
                ind = (*s.begin()).second; ind = -ind;
                s.erase(s.begin());
                used[ind] = true;
            }
            cout<<f[ind]<<'\n';
        }else{
            int v; cin>>v;
            int lo = 0 , hi = h[v] + 1;
            while(hi - lo > 1){
                int mid = (lo + hi)/2;
                int p = i_par(v , mid);
                if(used[st[p]] == true)lo = mid; else hi = mid;
            }
            int x = i_par(v , lo);
            used[st[x]] = false;
            cout<<h[v] - h[x]<<'\n';
            s.insert({en[x] , -st[x]});
        }
    }
}

Compilation message (stderr)

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