Cod sursa(job #684213)

Utilizator eukristianCristian L. eukristian Data 20 februarie 2012 20:10:30
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <cstdio>
#define MAXN 250001
#define MAXM 300001

int n, m;
int dyn[18][MAXN];

void read();
void solve();

int nthParent(int nd, int nr)
{
	int lognr =0, nrcp = nr, result = nd;
	while (nrcp >>= 1)
		lognr++;
		
	for (int i = lognr ; i >= 0 ; --i)
		if (nr & (1 << i))
			result = dyn[i][result];
	
	return result;
}

int main()
{
	read();
	solve();
	
	freopen("stramosi.out", "w", stdout);
	for (int i = 1 ; i <= m ; ++i)
	{
		int q, p;
		scanf("%d%d", &q, &p);
		printf("%d\n", nthParent(q, p));
	}
	
	return 0;
}

void read()
{
	freopen("stramosi.in", "r", stdin);
	scanf("%d%d", &n, &m);
	
	for (int i = 1 ; i <= n ; ++i)
		scanf("%d", &dyn[0][i]);
}

void solve()
{
	int copyOfN = n, logn = 0;
	while (copyOfN >>= 1)
		logn++;
		
	for (int i = 1 ; i <= logn ; ++i)
		for (int j = 1 ; j <= n ; ++j)
			dyn[i][j] = dyn[i - 1][dyn[i - 1][j]];
}