Cod sursa(job #726923)

Utilizator gabriel93Robu Gabriel gabriel93 Data 27 martie 2012 17:11:53
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
#include<vector>
#define Nmax 250002
using namespace std;

int n,m;
int a[20][Nmax];//a[i][j]=2^i-lea stramos a lui j

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

void rezolv()
{
	int i,j,x,p;
	for(i=1;i<=18;++i)
		for(j=1;j<=n;++j)
			a[i][j]=a[i-1][a[i-1][j]];//calculam 2^i stramos in functie de 2^(i-1)
	for(i=1;i<=m;++i)
	{
		scanf("%d %d",&x,&p);
		j=0;//puterea lui 2 pana in acest moment
		while(p)
		{
			if(p&1)//daca primul bit a lui p este 1 <=> while(p%2==1) 
				x=a[j][x];//mergem la urmatorul stramos
			++j;//crestem puterea lui 2
			p=p>>1;//mutam fiecare bit a lui p cu o poz la dreapta <=> p=p/2;
		}
		printf("%d\n",x);
	}
}

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