제출 #1290035

#제출 시각아이디문제언어결과실행 시간메모리
1290035kamBall Machine (BOI13_ballmachine)C++20
16.11 / 100
1098 ms29148 KiB
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<cassert>
#include<numeric>
#include<vector>
#include<string>
#include<chrono>
#include<random>
#include<stack>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#include<ios>
using namespace std;
using ll = long long;
vector<vector<int>>gp,up;
vector<int>sub, srt, black, rev;
int qq = 0, n, sz=21;

bool cm(int& a, int& b) {
	return sub[a] < sub[b];
}

void build(int u, int p) {
	up[u][0] = p;
	for (int i = 1; i < sz; i++) {
		if (up[u][i - 1] == -1) break;
		up[u][i] = up[up[u][i - 1]][i - 1];
	}
	for (int& v : gp[u]) {
		if (v == p) continue;
		build(v, u);
	}
}

void dfs(int u, int p) {
	for (int& v : gp[u]) {
		if (v == p) continue;
		dfs(v, u);
		sub[v] = min(sub[v], sub[u]);
	}
}

void make(int u, int p) {
	for (int& v : gp[u]) {
		if (v == p) continue;
		make(v, u);
	}
	rev[u] = qq;
	srt[qq++] = u + 1;
}

vector<int> get(int u) {
	int res = 0;
	for (int i = sz - 1; i >= 0; i--) {
		if (up[u][i] == -1)continue;
		if (black[up[u][i]]) {
			u = up[u][i], res += (1 << i);
		}
	}
	return { u,res };
}

void solve()
{
	int q; cin >> n >> q;
	int root = 0;
	sub = srt = black = rev = vector<int>(n);
	gp = vector<vector<int>>(n);
	for (int i = 0; i < n; i++) {
		int x; cin >> x;
		if (x == 0) {
			root = i;
			continue;
		}
		gp[i].push_back(--x);
		gp[x].push_back(i);
	}
	for (int i = 0; i < n; i++)sub[i] = i;
	dfs(root, -1);
	
	for (int i = 0; i < n; i++) sort(begin(gp[i]), end(gp[i]), cm);
	make(root, -1);

	set<pair<int, int>>st;
	for (int i = 0; i < n; i++)st.insert({ i,srt[i] });

	up = vector<vector<int>>(n, vector<int>(sz, -1));
	build(root, -1);
	
	while (q--) {
		int t, k; cin >> t >> k;
		if (t == 1) {
			int res = 0;
			//cout << st.size() << endl;
			while (k--) {
				pair<int, int> ab = *st.begin();
				//cout << "brat - ";
				//cout << ab.first << " " << ab.second << endl;
				st.erase(st.begin());
				black[ab.second - 1] = true;
				res = ab.second;
			}
			cout << res << endl;
			continue;
		}
		vector<int>lavaxper = get(k - 1);
		black[lavaxper[0]] = false;
		st.insert({ rev[lavaxper[0]], lavaxper[0] + 1 });
		cout << lavaxper[1] << endl;
	}
}

signed main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(nullptr);

	//freopen("b3.in", "r", stdin);
	//freopen("b3.out", "w", stdout);

	//signed _; cin >> _; while (_--)
	solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...