Cod sursa(job #690589)

Utilizator Catah15Catalin Haidau Catah15 Data 25 februarie 2012 19:07:05
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>

using namespace std;

#define maxN 250000
#define maxS 18

int dp[maxS][maxN];


int solve (int nod, int K)
{	
	int p;
	
	for (p = 0; (1 << p) <= K; ++ p); 
	
	-- p;
	
	if (dp[p][nod] == 0) return 0;
	if ((1 << p) == K) return dp[p][nod];
	return solve (dp[p][nod], K - (1 << p));
}


int main()
{
	freopen ("stramosi.in", "r", stdin);
	freopen ("stramosi.out", "w", stdout);
	
	int N, M;
	
	scanf ("%d %d", &N, &M);
	
	for (int i = 1; i <= N; ++ i) scanf ("%d", &dp[0][i]);
	
	for (int j = 1; (1 << j) <= N; ++ j)
		for (int i = 1; i <= N; ++ i) dp[j][i] = dp[j - 1][dp[j - 1][i]];
	
	while (M --)
	{
		int Q, P;
		
		scanf ("%d %d", &Q, &P);
		printf ("%d\n", solve (Q, P));
	}
	
	return 0;
}