Cod sursa(job #389566)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 1 februarie 2010 20:51:07
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.64 kb
#include<cstdio>
#define N 100001
int gr[N],n,m,d[N],x,y;
void df(int x)
{
	if (gr[x]==x)
	{
		d[x]=1;
		return;
	}
	df(gr[x]);
	d[x]=1+d[gr[x]];
}
void solve()
{
	if (d[x]<d[y])
	{
		int aux=x;
		x=y;
		y=aux;
	}
	for (;d[x]>d[y];x=gr[x]);
	for (;x!=y;x=gr[x],y=gr[y]);
}
void citire()
{
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d%d",&n,&m);
	gr[1]=1;
	for (int i=2; i<=n; ++i)
	{
		scanf("%d",&x);
		gr[i]=x;
	}
	for (int i=1; i<=n; ++i)
		if (!d[i])
			df(i);
	while (m--)
	{
		scanf("%d%d",&x,&y);
		solve();
		printf("%d\n",x);
	}
}
int main()
{
	citire();
	return 0;
}