Cod sursa(job #1697690)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 2 mai 2016 18:18:46
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <vector>
using namespace std;

#define MAXNUM 250005
#define maximum(a,b) (a>b)?(a):(b)

int ancestors[19][MAXNUM];
int n, m;

int lg2(int x)
{
	int i;

	for (i = 0; (1 << i) <= x; i++);

	return maximum(i - 1, 0);
}

int getAncestor(int node, int p)
{
	if (node == 0 || p > 250000)
		return 0;
	if (p == 0)
		return node;

	int l = lg2(p);

	if ((1 << l) == p)
		return ancestors[l][node];
	else
		return getAncestor(ancestors[l][node], p - (1 << l));
}

int main()
{
	freopen("stramosi.in", "r", stdin);
	freopen("stramosi.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i++)
	{
		int ancestor;
		scanf("%d", &ancestor);
		
		ancestors[0][i] = ancestor;
	}

	for (int i = 1; i <= 18; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			ancestors[i][j] = ancestors[i - 1][ancestors[i - 1][j]];
		}
	}

	for (int i = 1; i <= m; i++)
	{
		int p, node;
		scanf("%d %d", &node, &p);

		printf("%d\n", getAncestor(node, p));
	}

	return 0;
}