Cod sursa(job #678324)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 11 februarie 2012 14:21:02
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<cstdio>
#define min(a,b) (a<b)?a:b
#define max(a,b) (a>b)?a:b
using namespace std;
int n,m,i,t,x,y,j,tata,a,b;
struct nod{int info; nod*adr;}*v[100003],*p;
int eul[200005],q,minn;
int niv[100005];
int poz[100005];
void dfs(int nd,int k)
{
	nod*p=v[nd];
	eul[++q]=nd;
	poz[nd]=q;
	niv[nd]=k;
	while(p)
	{
	  dfs(p->info,k+1);
	  eul[++q]=nd;
	  p=p->adr;
	}
}

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",&t);
		p=new nod;
		p->info=i; p->adr=v[t]; v[t]=p;
	}
	dfs(1,0);
	for(i=1;i<=m;i++)
	{
		minn=2000000;
		scanf("%d %d",&x,&y);
		b=max(poz[x],poz[y]);
		a=min(poz[x],poz[y]);
		for(j=a;j<=b;j++)
			if(niv[eul[j]]<minn){tata=eul[j]; minn=niv[eul[j]]; }
		printf("%d\n",tata);
	}
	
return 0;}