제출 #238451

#제출 시각아이디문제언어결과실행 시간메모리
238451Andrei_CotorBall Machine (BOI13_ballmachine)C++11
100 / 100
336 ms26232 KiB
#include<iostream> #include<vector> #include<algorithm> #include<set> using namespace std; int P[20][100005]; vector<int> Sons[100005]; int Val[100005]; bool Ball[100005]; int Priority[100005]; set<pair<int,int> > S; void dfs(int nod) { Val[nod]=nod; for(auto son:Sons[nod]) { dfs(son); Val[nod]=min(Val[nod],Val[son]); } } bool cmp(int a, int b) { return Val[a]<Val[b]; } int nr; void getPriority(int nod) { sort(Sons[nod].begin(),Sons[nod].end(),cmp); for(auto son:Sons[nod]) getPriority(son); Priority[nod]=++nr; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; int root=0; for(int i=1; i<=n; i++) { cin>>P[0][i]; Sons[P[0][i]].push_back(i); if(P[0][i]==0) root=i; } for(int i=1; i<=16; i++) { for(int j=1; j<=n; j++) P[i][j]=P[i-1][P[i-1][j]]; } dfs(root); getPriority(root); for(int i=1; i<=n; i++) S.insert({Priority[i],i}); for(int i=1; i<=q; i++) { int tip,x; cin>>tip>>x; if(tip==1) { int rez=0; for(int j=1; j<=x; j++) //suma x-ilor va fi max n+q { int nod=(*S.begin()).second; S.erase(S.begin()); Ball[nod]=1; rez=nod; } cout<<rez<<"\n"; } else { int rez=0; for(int i=16; i>=0; i--) { if(Ball[P[i][x]]) { rez+=(1<<i); x=P[i][x]; } } cout<<rez<<"\n"; Ball[x]=0; S.insert({Priority[x],x}); } } 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...