제출 #963418

#제출 시각아이디문제언어결과실행 시간메모리
963418pccBall Machine (BOI13_ballmachine)C++17
16.11 / 100
151 ms45448 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #define fs first #define sc second #define tlll tuple<ll,ll,ll> const int mxn = 1e5+10; vector<int> tree[mxn]; vector<int> eul; int par[mxn][20],dep[mxn]; int N,Q; int rt; int dp[mxn]; int dfn[mxn]; set<int> st; void dfs(int now){ for(int i = 1;i<20;i++)par[now][i] = par[par[now][i-1]][i-1]; sort(tree[now].begin(),tree[now].end()); for(auto nxt:tree[now]){ dep[nxt] = dep[now]+1; par[nxt][0] = now; dfs(nxt); } dfn[now] = eul.size(); eul.push_back(now); return; } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>N>>Q; for(int i = 1;i<=N;i++){ int p; cin>>p; par[i][0] = p; tree[p].push_back(i); if(!p)rt = i; } par[rt][0] = rt; dfs(rt); for(int i = 0;i<N;i++)st.insert(i); int C = 0; while(Q--){ int t,k; cin>>t>>k; int lst = 0; //assert(C == N-st.size()); if(t == 1){ C += k; while(k--){ lst = eul[*st.begin()]; st.erase(*st.begin()); dp[lst] = 1; } cout<<lst<<'\n'; } else{ C--; lst = k; assert(dp[k]); for(int i = 19;i>=0;i--){ if(dp[par[lst][i]])lst = par[lst][i]; } st.insert(dfn[lst]); dp[lst] = 0; cout<<dep[k]-dep[lst]<<'\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...