Cod sursa(job #91392)

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

int s[64][256000];
bool v[256000], t[256000];
int cd[368000];
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=0; (1<<j)<=nivel; j++)
//			for (j=1; j<=nivel-i; j<<=1)
				s[j+1][cd[i]]=cd[i+(1<<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;
}