Cod sursa(job #567609)

Utilizator gyeresihunorGyeresi Hunor gyeresihunor Data 30 martie 2011 11:30:52
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include "stdio.h"
#include "stdlib.h"

#define N NULL

typedef struct alma
{
	int x;
	alma *kov;
}LMA;

alma *t[100010];
alma *p,*q;
alma *veg;
alma *masol(alma *ki,alma *kibe);

int n,m,i,a,b,kicsoda;

int main()
{
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		t[i]=(alma*)malloc(sizeof(alma));
		t[i]->x=i;
		t[i]->kov=N;
	}
	for(i=2;i<=n;i++)
	{
		scanf("%d",&a);
		alma *uj=N;
		uj=masol(t[a],uj);
		veg->kov=t[i];
		t[i]=uj;
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		p=t[a];
		q=t[b];
		int ok=1;
		while(p&&q&&ok)
		{
			if(p->x==q->x)
			{
				kicsoda=p->x;
				p=p->kov;
				q=q->kov;
			}
			else ok=0;
		}
		printf("%d\n",kicsoda);
	}
	return 0;
}

alma *masol(alma *ki,alma *kibe)
{
	if(ki==N)return N;
	kibe=(alma*)malloc(sizeof(alma));
	kibe->x=ki->x;
	kibe->kov=N;
	veg=kibe;
	kibe->kov=masol(ki->kov,kibe->kov);
	return kibe;
}