Submission #944639

#TimeUsernameProblemLanguageResultExecution timeMemory
944639tamir1Ball Machine (BOI13_ballmachine)C++17
100 / 100
142 ms28624 KiB
#include<bits/stdc++.h>
#define ll int
using namespace std;
ll i,j,n,q,x,y,root,a[100005],jump[100005][21],p[100005],dist[100005];
set<ll> s;
set<ll> ::iterator it;
vector<ll> v[100005],u;
bitset<100005> ball;
void dfs(ll x){
	a[x]=x;
	for(ll i:v[x]){
		dist[i]=dist[x]+1;
		dfs(i);
		a[x]=min(a[x],a[i]);
	}
}
bool cmp(ll x,ll y){
	return a[x]<a[y];
}
void dfs1(ll x){
	for(ll i:v[x]){
		dfs1(i);
	}
	p[x]=u.size();
	u.push_back(x);
}
ll up(ll x){
	ll i;
	for(i=20;i>=0;i--){
		if(ball[jump[x][i]]) x=jump[x][i];
	}
	return x;
}
int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin >> n >> q;
	for(i=1;i<=n;i++){
		cin >> jump[i][0];
		s.insert(i-1);
		if(jump[i][0]==0) root=i;
		else v[jump[i][0]].push_back(i);
	}
	for(j=1;j<=20;j++){
		for(i=1;i<=n;i++){
			jump[i][j]=jump[jump[i][j-1]][j-1];
		}
	}
	dfs(root);
	for(i=1;i<=n;i++){
		sort(v[i].begin(),v[i].end(),cmp);
	}
	dfs1(root);
	while(q--){
		cin >> x >> y;
		if(x==1){
			for(i=1;i<=y;i++){
				it=s.begin();
				x=u[*it];
				ball[x]=1;
				s.erase(it);
			}
			cout << x << "\n";
		}
		else{
			x=up(y);
			ball[x]=0;
			s.insert(p[x]);
			cout << dist[y]-dist[x] << "\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...