Cod sursa(job #450834)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 8 mai 2010 14:37:39
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
/*
    a[i][j] -> al 2^i-lea stramos al nr j
	a[i][j] = a[i-1][ a[i-1][j] ]
	Al 2^(i-1)-lea stramos al 2^(i-1)-lea stramos al nr x e al 2^(i-1)+2^(i-1) = 2^i lea stramos al nr x. 
	la interogari, impart cerinta in suma de puteri ale lui 2, a[x][a[y][a[z][x]]] pt n = 2^x + 2^y + 2^z.
*/

#include <cstdio>

const int L = 18;
const int N = 250001;

int a[L][N],n,m;

void citire()
{
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= n; ++i)
		scanf("%d",&a[0][i]);
}

int exponent_maxim_2 (int nr)
{
	int x = 1<<L, p = L;
	while (x > nr)
	{
		x >>= 1;
		p -= 1;
	}
	return p;
}

void completare_a()
{
	int l = exponent_maxim_2(n) + 1;
	for (int i = 1; i <= l; ++i)
		for (int j = 1; j <= n; ++j)
			a[i][j] = a[i-1][ a[i-1][j] ];
}

int raspuns(int x, int nr)
{
	if (nr == 0)
		return x;
	int i = 0;
	while (1<<i <= nr)
		++i;
	--i;
	while (i >= 0)
	{
		if (1<<i <= nr)
		{
			x = a[i][x];
			nr -= 1<<i;
		}
		--i;
	}
	return x;
}

void raspundere()
{
	int a,b;
	for (int i = 1; i <= m; ++i)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",raspuns(a,b));
	}
}

int main()
{
	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	citire();
	completare_a();
	raspundere();
	return 0;
}