Cod sursa(job #91379)

Utilizator the1dragonIonita Alexandru the1dragon Data 12 octombrie 2007 11:35:40
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>

int s[64][256000];
bool v[256000], t[256000];
int cd[512000];
void binary_df(int nod)
{
	int nivel=1, i, j;
	cd[nivel]=nod;
	while(cd[nivel]!=0)
	{
		++nivel;
		cd[nivel]=s[1][cd[nivel-1]];
	}
	--nivel;
	for (i=1; i<=nivel; i++)
	{
		if (!t[cd[i]])
		{
			t[cd[i]]=1;
			for (j=1; j<=nivel; j<<=1)
				s[j][cd[i]]=cd[i+j];
		}
	}
}

int cauta(int A, int B)
{
	int i;
	for (i=0; (1<<i)<=B; i++)
	{
		if ((1<<i)==B)
		{
			return s[i+1][A];
		}
	}
	return cauta(s[i][A], B-(1<<(i-1)) );
}
int main()
{
	freopen("stramosi.in", "r", stdin);
	freopen("stramosi.out", "w", stdout);
	int n, m, i, A, B;
	scanf("%d%d", &n, &m);
	for (i=1; i<=n; i++)
	{
		scanf("%d", &s[1][i]);
		v[s[1][i]]=1;
	}
	for (i=1; i<=n; i++)
		if (!v[i])
		{
			binary_df(i);
		}
	for (i=1; i<=m; i++)
	{
		scanf("%d %d", &A, &B);
		printf("%d\n", cauta(A, B));
	}
	int j;
	for (i=1; i<=n; i++)	//sparg linia de cache
	{
		printf("%d -> ", i);
		for (j=1; j<=5; j++)
		{
			printf("%d ", s[j][i]);
		}
		printf("\n");
	}
	return 0;
}