Cod sursa(job #584454)

Utilizator bugyBogdan Vlad bugy Data 25 aprilie 2011 16:15:50
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 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);
	
	
	//urc in nivel pentru x SI y
		
	b1=x;
		if(b1!=1)
			a1=tata[b1]; 
	
	b2=y;
		if(b2!=1)
			a2=tata[b2]; 
	
	mark[b1]=i;
	
	if(mark[b2]==i)
		{fprintf(g,"%d\n",b2); continue;}
	else mark[b2]=i;
	
	ok=1;
		while(ok)
		{		
	
		if(mark[a1] == i)
			{fprintf(g,"%d\n",a1); break;}
		else 
		{
			if(a1!=1)
			mark[a1] = i;
			
			if(mark[a2] == i)
				{fprintf(g,"%d\n",a2); break;}
			else if(a2!=1)
				mark[a2]=i;		
		}	
		
		b1=a1;
			if(a1!=1)
				a1=tata[b1];
		b2=a2; 
			if(a2!=1)
				a2=tata[b2];	
		if(a1==a2 && a1==1)
			{fprintf(g,"1\n"); break;}
		}	
	
}

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