제출 #1328052

#제출 시각아이디문제언어결과실행 시간메모리
1328052aren_danceBall Machine (BOI13_ballmachine)C++20
100 / 100
246 ms29808 KiB
#include <bits/stdc++.h>
//#include "incursion.h"
using namespace std;
const int N=2e5+1;
const int M=21;
#define ll long long
int a[N];
int p[N];
vector<int> g[N];
int up[N][M];int sz[N];
int dep[N];
int dp[N];
int fl[N];
int dp_rev[N];
int sr[N];
void dfs(int v,int p){
    dep[v]=dep[p]+1;
    up[v][0]=p;
    for(int i=1;i<M;++i){
        up[v][i]=up[up[v][i-1]][i-1];
    }
    sz[v]=1;
    sr[v]=v;
    for(auto i:g[v]){
        if(i==p){
            continue;
        }
        dfs(i,v);
        sr[v]=min(sr[v],sr[i]);
        sz[v]+=sz[i];
    }
}
void dfs1(int v,int p,int c){
    for(auto i:g[v]){
        if(i==p){
            continue;
        }
        dfs1(i,v,c);
        c+=sz[i];
    }
    dp[v]=c;
    dp_rev[c]=v;
}
int main(){
    int n,q;
    cin>>n>>q;
    int root;
    for(int i=1;i<=n;++i){
        cin>>p[i];
        if(p[i]==0){
            root=i;
        }
        g[p[i]].push_back(i);
        g[i].push_back(p[i]);
    }
    dfs(root,0);
    for(int i=1;i<=n;++i){
        vector<pair<int,int>> ms;
        for(auto j:g[i]){
            ms.push_back({sr[j],j});
        }
        sort(ms.begin(),ms.end());
        for(int j=0;j<g[i].size();++j){
            g[i][j]=ms[j].second;
        }
    }
    dfs1(root,0,0);
    set<int> cl;
    for(int i=0;i<n;++i){
        cl.insert(i);
    }
    while(q--){
        int type,k;
        cin>>type>>k;
        if(type==1){
            for(int i=1;i<=k;++i){
                fl[dp_rev[*cl.begin()]]=1;
                if(i==k){
                    cout<<dp_rev[*cl.begin()]<<'\n';
                }
                cl.erase(cl.begin());
            }
            continue;
        }
        int v=k;
        int x=0;
        for(int j=M-1;j>=0;--j){
            if(fl[up[v][j]]){
                v=up[v][j];
                x+=(1<<j);
            }
        }
        fl[v]=0;
        cl.insert(dp[v]);
        cout<<x<<'\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...