Submission #1244995

#TimeUsernameProblemLanguageResultExecution timeMemory
1244995kaiboyBall Machine (BOI13_ballmachine)C++20
100 / 100
90 ms14148 KiB
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 100000;

int *ej[N], eo[N], dd[N], pp[N], qq[N], aa[N], hh[N], pq[N], iq[N + 1], pq_cnt;

void append(int i, int j) {
	int o = eo[i]++;
	if (!o)
		ej[i] = (int *) malloc(sizeof *ej[i]);
	else if (!(o & o - 1))
		ej[i] = (int *) realloc(ej[i], (o << 1) * sizeof *ej[i]);
	ej[i][o] = j;
}

int dfs(int p, int i, int d) {
	dd[i] = d++, pp[i] = qq[i] = p;
	if (dd[pp[i]] - dd[qq[pp[i]]] == dd[qq[pp[i]]] - dd[qq[qq[pp[i]]]])
		qq[i] = qq[qq[pp[i]]];
	int a = i;
	for (int o = 0; o < eo[i]; o++)
		a = min(a, dfs(i, ej[i][o], d));
	return aa[i] = a;
}

void dfs(int i) {
	static int h = 0;
	for (int o = 0; o < eo[i]; o++)
		dfs(ej[i][o]);
	hh[i] = h++;
}

bool lt(int i, int j) {
	return hh[i] < hh[j];
}

int p2(int p) {
	return (p <<= 1) > pq_cnt ? 0 : p ^ (p < pq_cnt && lt(iq[p ^ 1], iq[p]));
}

void pq_up(int i) {
	int j, p, q;
	for (p = pq[i]; (q = p >> 1) && lt(i, j = iq[q]); p = q)
		iq[pq[j] = p] = j;
	iq[pq[i] = p] = i;
}

void pq_dn(int i) {
	int j, p, q;
	for (p = pq[i]; (q = p2(p)) && lt(j = iq[q], i); p = q)
		iq[pq[j] = p] = j;
	iq[pq[i] = p] = i;
}

void pq_add_last(int i) {
	iq[pq[i] = ++pq_cnt] = i;
}

void pq_add(int i) {
	pq[i] = ++pq_cnt, pq_up(i);
}

int pq_remove_first() {
	int i = iq[1], j = iq[pq_cnt--];
	if (i != j)
		pq[j] = 1, pq_dn(j);
	pq[i] = 0;
	return i;
}

int search(int i) {
	while (pp[i] != i && !pq[pp[i]])
		i = !pq[qq[i]] ? qq[i] : pp[i];
	return i;
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int n, q; cin >> n >> q;
	int r = -1;
	for (int i = 0; i < n; i++) {
		int p; cin >> p, p--;
		if (p == -1)
			r = i;
		else
			append(p, i);
	}
	dfs(r, r, 0);
	for (int i = 0; i < n; i++)
		sort(ej[i], ej[i] + eo[i], [] (int j0, int j1) { return aa[j0] < aa[j1]; });
	dfs(r);
	for (int i = 0; i < n; i++)
		pq_add_last(i);
	for (int p = pq_cnt >> 1; p; p--)
		pq_dn(iq[p]);
	while (q--) {
		int t; cin >> t;
		if (t == 1) {
			int k; cin >> k;
			while (k--) {
				int i = pq_remove_first();
				if (!k)
					cout << i + 1 << '\n';
			}
		} else {
			int i; cin >> i, i--;
			int p = search(i); pq_add(p);
			cout << dd[i] - dd[p] << '\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...