Cod sursa(job #690583)

Utilizator Catah15Catalin Haidau Catah15 Data 25 februarie 2012 19:02:52
Problema Stramosi Scor 80
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[maxN][maxS];


int solve (int nod, int K)
{	
	int p;
	
	for (p = 0; (1 << p) <= K; ++ p); 
	
	-- p;
	
	if (dp[nod][p] == 0) return 0;
	if ((1 << p) == K) return dp[nod][p];
	return solve (dp[nod][p], 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[i][0]);
	
	for (int j = 1; (1 << j) <= N; ++ j)
		for (int i = 1; i <= N; ++ i) dp[i][j] = dp[dp[i][j - 1]][j - 1];
	
	while (M --)
	{
		int Q, P;
		
		scanf ("%d %d", &Q, &P);
		printf ("%d\n", solve (Q, P));
	}
	
	return 0;
}