Cod sursa(job #871822)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 5 februarie 2013 12:05:13
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb

#include <cstdio>

const int MAX_N(250001);

int dp [20] [MAX_N];
int log [MAX_N];
int n;

inline void build (void)
{
	for (int index(2) ; index <= n ; ++index)
		log[index] = log[index >> 1] + 1;
	int i, j;
	for (i = 1 ; i <= log[n] ; ++i)
		for (j = 1 ; j <= n ; ++j)
			dp[i][j] = dp[i - 1][dp[i - 1][j]];
}

inline int query (int node, int k)
{
	while (node && k)
	{
		node = dp[log[k]][node];
		k -= 1 << log[k];
	}
	return node;
}

int main (void)
{
	std::freopen("stramosi.in","r",stdin);
	std::freopen("stramosi.out","w",stdout);
	int m;
	std::scanf("%d %d",&n,&m);
	for (int index(1) ; index <= n ; ++index)
		std::scanf("%d",&dp[0][index]);
	build();
	int x, y;
	while (m)
	{
		std::scanf("%d %d",&x,&y);
		std::printf("%d\n",query(x,y));
		--m;
	}
	std::fclose(stdin);
	std::fclose(stdout);
	return 0;
}