Cod sursa(job #349840)

Utilizator blasterzMircea Dima blasterz Data 21 septembrie 2009 17:11:58
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
// @author: Mircea Dima

#include <cstdio>
#include <cstdlib>
#define N 250001
#define dim 8192

char ax[dim];
int pz;

inline void cit(int &x)
{
	x = 0;
	while(ax[pz] < '0' || ax[pz] > '9')
		if(++pz == dim) fread(ax,1,dim,stdin), pz = 0;

	while(ax[pz] >= '0' && ax[pz] <= '9')
	{
		x = x * 10 + ax[pz] - '0';
		if(++pz == dim) fread(ax,1,dim,stdin),pz = 0;
	}
}

int t[19][N];
int n, m;


void init()
{
	int i, j;

	for(i = 1; i <= 18; ++i)
		for(j = 1; j <= n; ++j)
			t[i][j] = t[i-1][t[i-1][j]];

	/*
	for(i = 0; i < 4; ++i)
	{
		for(j = 1; j <= n; ++j)
			printf("%d ", t[i][j]);
		printf("\n");
	}
	*/

}



int main()
{
	freopen("stramosi.in","r",stdin);
	cit(n); cit(m);


	int i;
	for(i = 1; i <= n; ++i)
		cit(t[0][i]);

	init();
	
	int p, q;

	freopen("stramosi.out","w",stdout);
	while(m--)
	{
		
		cit(p); cit(q);
		for(i = 18; i >= 0 && q; --i)
			if(q - (1<<i) >= 0)
			if(t[i][p] != 0) p = t[i][p], q -= (1<<i);

		if(q != 0) p = 0;
		printf("%d\n", p);
		

	}
	//system("pause");

	return 0;
}