Cod sursa(job #2099739)

Utilizator flibiaVisanu Cristian flibia Data 4 ianuarie 2018 17:17:39
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
#define N 250100

using namespace std;

#define dim 100000
char buff[dim];
int p = 0;

void read(int &nr){
	nr = 0;
	while(buff[p] < '0' || buff[p] > '9')
		if(++p == dim) fread(buff, 1, dim, stdin), p = 0;
	while(buff[p] >= '0' && buff[p] <= '9'){
		nr = 10*nr + buff[p] - '0';
		if(++p == dim) fread(buff, 1, dim, stdin), p = 0;
	}
}

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

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

int solve(int nod, int p){
	if(p == 0)
		return nod;
	int lvl = 0;
	while((1 << lvl) - 1 <= p)
		lvl++;
	lvl--;
	if(anc[lvl][nod] == 0)
		return 0;
	return solve(anc[lvl][nod], p - (1 << lvl) + 1); 
}

//void solve(){
//	if(anc[(int)log2(y)][x] == 0){
//		cout << "0\n";
//		return;
//	}
//	int cnt = 0;
//	while(cnt < y && dad[x] != 0){
//		int lvl = 1;
//		while(cnt + (1 << lvl) - 1 <= y && anc[lvl][x] != 0){
//			cnt += (1 << lvl) - 1;
//			x = anc[lvl][x];
//			lvl++;
//		}
//	}
//	cout << (cnt == y ? x : 0) << '\n';
//}

int main(){
	freopen("stramosi.in", "r", stdin);
	freopen("stramosi.out", "w", stdout);
	cin >> n >> q;
	for(int i = 1; i <= n; i++){
		read(x);
		if(x == 0)
			continue;
		dad[i] = x;
	}
	build();
	while(q--)
		read(x), read(y), cout << solve(x, y) << '\n';
	return 0;
}