Cod sursa(job #151280)

Utilizator peanutzAndrei Homorodean peanutz Data 7 martie 2008 22:59:42
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <string.h>
#include <math.h>

#define NMAX 250010
#define LOG 20

long m, n;
long a[LOG][NMAX];
long raised[LOG];
int powmax;

inline int smaller(int n)
{
	long pow = 1;
	int i = 0;
	while(pow <= n) pow *= 2, ++i;
	return i-1;
}


void read()
{
	long i;
        long pow;
	scanf("%ld %ld", &n, &m);
	for(i = 1; i <= n; ++i)
		scanf("%ld ", &a[0][i]);
	powmax = smaller(n);
	raised[0] = 1;
	for(i = 1, pow = 2; pow <= n; ++i, pow *= 2)
		raised[i] = pow;
}

void solve()
{
	int i, j;
	for(i = 1; i <= powmax; ++i)
		for(j = 1; j <= n; ++j)
			a[i][j] = a[ i-1 ][ a[i-1][j] ];
}

void query()
{
	long x, y;
	int pow;
	while(m--)
	{
		scanf("%ld %ld", &x, &y);
		while(y)
		{
			pow = smaller(y);
			x = a[pow][x];
			y -= raised[pow];
		}
		printf("%ld\n", x);
	}
}


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

	read();

	solve();
	/*
	printf("%d\n", powmax);
	int i, j;
	for(i = 0; i <= powmax; ++i, printf("\n"))
		for(j = 1; j <= n; ++j)
			printf("%d ", a[i][j]);

	*/

	query();


	return 0;
}