Submission #1126778

#TimeUsernameProblemLanguageResultExecution timeMemory
1126778Halym2007Ball Machine (BOI13_ballmachine)C++17
100 / 100
126 ms29368 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sz size()
#define ff first
#define ss second
#define pb push_back
#define pii pair <int, int>
#define dur exit(0)
#define dur1 return(0)
const int N = 2e5 + 5;
const int LOG = 17;
int qu[N], o, p[N][LOG], ball[N], val[N], bal[N];
set <pii> yok;
vector <int> v[N];

bool cmp (int x, int y) {
	if (val[x] < val[y]) return 1;
	return 0;
}

void dfs (int x, int par) {
	val[x] = x;
	for (int i : v[x]) {
		if (i == par) continue;
		dfs (i, x);
		val[x] = min (val[x], val[i]);
	} 
	sort (v[x].begin(), v[x].end(), cmp);
}


void dfs1 (int x, int par) {
	for (int i : v[x]) {
		if (i == par) continue;
		dfs1 (i, x);
	}
	qu[++o] = x;
}

pii cykar (int x) {
	int ret = 0;
	for (int i = LOG - 1; i >= 0; i--) {
		if (ball[p[x][i]]) {
			x = p[x][i];
			ret += (1 << i);
		}
	}
	return {x, ret};
}

int main () {
//	freopen ("input.txt", "r", stdin);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n, q, par;
	cin >> n >> q;
	for (int i = 1; i <= n; ++i) {
		cin >> p[i][0];
		if (p[i][0] != 0) {
			v[p[i][0]].pb (i);
			v[i].pb (p[i][0]);
		}
		else {
			par = i;
		}
	}
	dfs (par, -1);
	dfs1 (par, -1);
	for (int i = 1; i < LOG; ++i) {
		for (int j = 1; j <= n; ++j) {
			p[j][i] = p[p[j][i - 1]][i - 1];
		}
	}
	for (int i = 1; i <= n; ++i) {
		yok.insert ({i, qu[i]});
	}
	for (int i = 1; i <= n; ++i) {
		bal[qu[i]] = i;
	}
	while ( q-- ) {
		int type, x;
		cin >> type >> x;
		if (type == 1) {
			int jog = -1;
			for (int i = 1; i <= x; ++i) {
				pii tr = *yok.begin();
				yok.erase (yok.begin());
				ball[tr.ss] = 1;
				jog = tr.ss;
			}
			cout << jog << "\n";
		}
		else {
			pii x1 = cykar (x);
			cout << x1.ss << "\n";
			ball[x1.ff] = 0;
			yok.insert ({bal[x1.ff], x1.ff});
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...