Cod sursa(job #1713537)

Utilizator retrogradLucian Bicsi retrograd Data 5 iunie 2016 20:30:15
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 250005;
const int kSqrt = 128;

int Depth[kMaxN], Parent[kMaxN], Link[kMaxN];
vector<int> G[kMaxN];

void dfs() {
	queue<int> Q;
	Q.push(0);

	while(!Q.empty()) {
		int node = Q.front();
		Q.pop();

		for(int vec : G[node]) {
			Depth[vec] = Depth[node] + 1;
			Parent[vec] = node;
			Link[vec] = (Depth[node] % kSqrt) ? Link[node] : node;
			Q.push(vec);
		}
	}
}

int kth(int node, int k) {
	int seek_d = Depth[node] - k;
	if(seek_d <= 0) return 0;

	while(Depth[Link[node]] > seek_d)
		node = Link[node];
	while(Depth[node] != seek_d)
		node = Parent[node];

	return node;
}

void Read(int &a) {
	char c;
	for(c = getchar(); !isdigit(c); c = getchar());
	for(a = 0; isdigit(c); c = getchar())
		a = (a << 1) + (a << 3) + c - '0';
}

void W(int a) {
	if(a > 0) {
		W(a / 10);
		putchar(a % 10 + '0');
	}
}
void Write(int a) {
	if(a == 0) putchar('0');
	else W(a);
	putchar('\n');
}

int main() {
	freopen("stramosi.in", "r", stdin);
	freopen("stramosi.out", "w", stdout);

	int n, m, p;
		
	Read(n); Read(m);
	for(int i = 1; i <= n; ++i) {
		Read(p);
		G[p].push_back(i);
	}

	dfs();

	while(m--) {
		int a, b;
		Read(a); Read(b);
		Write(kth(a, b));
	}

	return 0;
}