제출 #255613

#제출 시각아이디문제언어결과실행 시간메모리
255613amoo_safarBall Machine (BOI13_ballmachine)C++14
100 / 100
287 ms31992 KiB
// Zende bad Shoma nasime faghat !
#include <bits/stdc++.h>

#define pb push_back
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " : " << x << '\n'

using namespace std;

typedef long long ll;
typedef long double ld;
typedef string str;
typedef pair<ll, ll> pll;

const ll Mod = 1000000007LL;
const int N = 2e5 + 10;
const ll Inf = 2242545357980376863LL;
const ll Log = 20;

int n, q, rt;
int par[N][Log];
int mn[N];

vector<int> G[N];

void DFS(int u, int p){
	par[u][0] = p;
	mn[u] = u;
	for(int i = 1; i < Log; i++) par[u][i] = par[par[u][i - 1]][i - 1];
	for(auto adj : G[u]){
		DFS(adj, u);
		mn[u] = min(mn[u], mn[adj]);
	}
}

set<int> st;

int mk[N], fn[N], rfn[N], T = 0;
void DFS2(int u){
	sort(all(G[u]), [&](int i, int j){
		return mn[i] < mn[j];
	});
	for(auto adj : G[u]){
		DFS2(adj);
	}
	fn[u] = T ++;
	rfn[fn[u]] = u;
	st.insert(fn[u]);
}


int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> q;
	int p;
	for(int i = 1; i <= n; i++){
		cin >> p;
		if(p) G[p].pb(i);
		else rt = i;
	}
	DFS(rt, 0);
	DFS2(rt);

	int ty, v, k, res;
	for(int i = 1; i <= q; i++){
		cin >> ty;
		if(ty == 1){
			cin >> k;
			for(int it = 0; it < k; it++){
				v = rfn[*st.begin()];
				st.erase(st.begin());
				mk[v] = 1;
			}
			cout << v << '\n';
		} else {
			cin >> v;
			res = 0;
			for(int lg = Log - 1; lg >= 0; lg--){
				if(mk[par[v][lg]]) res |= 1 << lg, v = par[v][lg];
			}
			mk[v] = 0;
			st.insert(fn[v]);
			cout << res << '\n';
		}
	}
	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...