Cod sursa(job #578266)

Utilizator mvbinfoDragos Dinca mvbinfo Data 11 aprilie 2011 10:19:41
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>
using namespace std;

int n,i,x,y,m,tata[100005],mark[100005],a1,a2,b1,b2,ok;

int main()
{
	FILE *f=fopen("lca.in","r"), *g=fopen("lca.out","w");
	
fscanf(f,"%d %d",&n,&m);

for(i=2;i<=n;i++)
	fscanf(f,"%d",&tata[i]);

for(i=1;i<=m;i++)
{
	fscanf(f,"%d %d",&x,&y);
	
	if(x==y)
		fprintf(g,"%d\n",x);
	else
	{
	//urc in nivel pentru x SI y
	
	a1=tata[x]; b1=x;
	
	a2=tata[y]; b2=y; 
	if(a1==0) a1=1;
	if(a2==0) a2=1;
	
	mark[b1]=i;
	mark[b2]=i;
	
	ok=1;
		while(ok)
		{
			
		if(a1 == 1 && a2 == 1)
			{fprintf(g,"1\n"); break;}
		
		if(mark[a1] == i)
			{fprintf(g,"%d\n",a1); break;}
		else 
		{
			mark[a1] = i;
			
			if(mark[a2] == i)
				{fprintf(g,"%d\n",a2); break;}
			else
				mark[a2]=i;		
		}	
		
		b1=a1;
			if(a1!=1)
				a1=tata[b1];
		b2=a2; 
			if(a2!=1)
				a2=tata[b2];	
	
		}	
	}
}

fclose(f);
fclose(g);
return 0;
}