제출 #1331091

#제출 시각아이디문제언어결과실행 시간메모리
1331091boclobanchatBall Machine (BOI13_ballmachine)C++20
100 / 100
129 ms23468 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
vector<int> ds[MAXN];
int fen[MAXN],sub[MAXN],pos[MAXN],P[MAXN],sp[MAXN][20],cnt=0;
bool comp(int a,int b) { return sub[a]<sub[b]; }
int getlog(long long n) { return 63-__builtin_clzll(n); }
void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
int walk(int n,int val) { int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>=fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; }
void dfs(int i,int pre)
{
	sub[i]=i;
	for(auto v:ds[i])
	{
		dfs(v,i);
		sub[i]=min(sub[i],sub[v]);
	}
	sort(ds[i].begin(),ds[i].end(),comp);
}
void dfs2(int i,int pre)
{
	sp[i][0]=pre;
	for(int j=1;j<=17;j++) sp[i][j]=sp[sp[i][j-1]][j-1];
	for(auto v:ds[i]) dfs2(v,i);
	pos[i]=++cnt,P[cnt]=i;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,q,root=-1;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
    	int res;
    	cin>>res;
    	if(!res) root=i;
    	else ds[res].push_back(i);
	}
	dfs(root,root);
	dfs2(root,0);
	for(int i=1;i<=n;i++) update(i,n,1);
	for(int i=1;i<=q;i++)
	{
		int t,v;
		cin>>t>>v;
		if(t==1)
		{
			while(v--)
			{
				int p=walk(n,0);
				update(p,n,-1);
				if(!v) cout<<P[p]<<"\n";
			}
		}
		else
		{
			int ans=0;
			for(int j=17;j+1;j--) if(sp[v][j]&&get(pos[sp[v][j]])==get(pos[sp[v][j]]-1)) v=sp[v][j],ans+=(1<<j);
			cout<<ans<<"\n";
			update(pos[v],n,1);
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...