제출 #206721

#제출 시각아이디문제언어결과실행 시간메모리
206721MvCBall Machine (BOI13_ballmachine)C++11
100 / 100
274 ms33292 KiB
#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> #define rc(x) return cout<<x<<endl,0 #define pb push_back #define mkp make_pair #define in insert #define er erase #define fd find #define fr first #define sc second typedef long long ll; typedef long double ld; const ll INF=0x3f3f3f3f3f3f3f3f; const ll llinf=(1LL<<62); const int inf=(1<<30); const int nmax=1e5+50; const int mod=1e9+7; using namespace std; int n,i,tt,mn[nmax],x,y,p[nmax],par[nmax][20],q,tp,rt,viz[nmax],l[nmax],vl[nmax]; vector<int>a[nmax]; set<pair<int,int> >s; void dfs(int x) { mn[x]=x; vector<pair<int,int> >vc; for(int i=0;i<(int)a[x].size();i++) { int y=a[x][i]; dfs(y); mn[x]=min(mn[x],mn[y]); vc.pb(mkp(mn[y],y)); } sort(vc.begin(),vc.end()); for(int i=0;i<(int)a[x].size();i++)a[x][i]=vc[i].sc; } void rec(int x) { for(int i=0;i<(int)a[x].size();i++)rec(a[x][i]); vl[x]=++tt; s.in(mkp(vl[x],x)); } void build(int x) { par[x][0]=p[x]; l[x]=l[p[x]]+1; for(int i=1;i<18;i++)par[x][i]=par[par[x][i-1]][i-1]; for(int i=0;i<(int)a[x].size();i++)build(a[x][i]); } int main() { //freopen("sol.in","r",stdin); //freopen("sol.out","w",stdout); //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0); cin>>n>>q; for(i=1;i<=n;i++) { cin>>p[i]; if(!p[i]) { rt=i; continue; } a[p[i]].pb(i); } dfs(rt); rec(rt); build(rt); //for(i=1;i<=n;i++)cout<<vl[i]<<" "; //cout<<endl; while(q--) { cin>>tp>>x; if(tp==1) { for(i=1;i<=x;i++) { y=s.begin()->sc; viz[s.begin()->sc]=1; s.er(s.begin()); } cout<<y<<'\n'; } else { y=x; for(i=17;i>=0;i--)if(viz[par[y][i]])y=par[y][i]; cout<<l[x]-l[y]<<'\n'; s.in(mkp(vl[y],y)); viz[y]=0; } } 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...