Submission #36539

#TimeUsernameProblemLanguageResultExecution timeMemory
36539Dat160601Ball Machine (BOI13_ballmachine)C++14
100 / 100
316 ms34472 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define fi first #define se second int n,q; int par[100007],mi[100007],root,num[100007],cnt=0; int op,x; int p[20][100007]; bool stat[100007]; vector <int> edge[100007],edge2[100007]; priority_queue < pair<int,int> , vector < pair<int,int> > , greater < pair<int,int> > > pr; void read(int &k){ int x; scanf("%d",&x); k=x; } void print(int x){ printf("%d\n",x); } void dfs(int u){ vector < pair<int,int> > cur; mi[u]=u; for(int i=0;i<(int)edge[u].size();i++){ int v=edge[u][i]; if(v==par[u]) continue; dfs(v); mi[u]=min(mi[u],mi[v]); cur.pb(mp(mi[v],v)); } sort(cur.begin(),cur.end()); for(int i=0;i<(int)cur.size();i++){ edge2[u].pb(cur[i].se); } } void dfs2(int u){ for(int i=0;i<(int)edge2[u].size();i++){ int v=edge2[u][i]; if(v==par[u]) continue; dfs2(v); } cnt++; num[u]=cnt; } int main(){ read(n); read(q); for(int i=1;i<=n;i++){ read(par[i]); edge[par[i]].pb(i); p[0][i]=par[i]; if(par[i]==0) root=i; mi[i]=1e9; } dfs(root); dfs2(root); for(int i=1;i<=n;i++) pr.push(mp(num[i],i)); for(int i=1;i<=19;i++){ for(int j=1;j<=n;j++){ p[i][j]=p[i-1][p[i-1][j]]; } } while(q--){ read(op); read(x); if(op==1){ int ans=0; while(x>0){ x--; int u=pr.top().se; stat[u]=true; ans=u; pr.pop(); } print(ans); } else{ int ans=0; for(int i=19;i>=0;i--){ int pr=p[i][x]; if(stat[pr]){ x=pr; ans+=(1<<i); } } stat[x]=false; pr.push(mp(num[x],x)); print(ans); } } }

Compilation message (stderr)

ballmachine.cpp: In function 'void read(int&)':
ballmachine.cpp:16:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&x);
                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...