Cod sursa(job #385353)

Utilizator BooZZySandu Bogdan BooZZy Data 22 ianuarie 2010 17:38:50
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<stdio.h>
int n,m,v[100005],ecl[200005],inl[200005],i,n1,n2,k,j;
void parcurgere(int q,int p)
{
	int f;
	for(f=1;f<=n;f++)
		if(v[f]==q)
		{
			ecl[k]=f,inl[k]=p,k++;
			parcurgere(f,p+1);
			ecl[k]=v[f],inl[k]=p-1,k++;
		}
}
void count(int x,int y)
{
	int min=2000000000,mini=2000000000;
	for(int t=x;t<k;t++)
	{
		if(inl[t]<mini)min=ecl[t],mini=inl[t];
		if(ecl[t]==y)
		{
			printf("%d\n",min);
			return;
		}
	}
}
int main()
{
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(i=2;i<=n;i++)
		scanf("%d",&v[i]);
	parcurgere(0,0);
	for(i=0;i<m;i++)
	{
		scanf("%d %d",&n1,&n2);
		for(j=0;j<k;j++)
			if(ecl[j]==n1)
			{			
				count(j,n2);
				break;
			}
	}
	return 0;
}