Cod sursa(job #2099657)

Utilizator flibiaVisanu Cristian flibia Data 4 ianuarie 2018 16:24:45
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>
#define N 250100

using namespace std;

ifstream in("stramosi.in");
ofstream out("stramosi.out");

int n, m, x, y, q, dad[N], anc[N][20];
bool viz[N], root[N];
vector <int> v[N];

void dfs(int tata, int nod){
	viz[nod] = 1;
	dad[nod] = tata;
	for(auto son : v[nod])
		if(!viz[son])
			dfs(nod, son);
}

void build(){
	int sz = log2(n);
	for(int i = 1; i <= n; i++)
		anc[i][0] = i;
	for(int lvl = 1; lvl <= sz; lvl++)
		for(int i = 1; i <= n; i++)
			x = anc[i][lvl - 1], anc[i][lvl] = anc[dad[x]][lvl - 1];
}

void solve(){
	in >> x >> y;
	int cnt = 0;
	while(cnt < y && dad[x] != 0){
		int lvl = 1;
		while(cnt + (1 << lvl) - 1 <= y && anc[x][lvl] != 0){
			cnt += (1 << lvl) - 1;
			x = anc[x][lvl];
			lvl++;
		}
	}
	out << (cnt == y ? x : 0) << '\n';
}

int main(){
	in >> n >> q;
	for(int i = 1; i <= n; i++){
		in >> x;
		if(x == 0)
			continue;
		root[i] = 1;
		v[x].push_back(i);
	}
	for(int i = 1; i <= n; i++)
		if(!root[i])
			dfs(0, i);
	build();
	while(q--)
		solve();
	return 0;
}