Cod sursa(job #760401)

Utilizator matei_cChristescu Matei matei_c Data 21 iunie 2012 11:33:38
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include<cstdio>
#include<algorithm>
using namespace std;

#define maxn 100001

int n,t ;
int tata[maxn] ;
int nivel[maxn] ;
int x,y ;

int lca(int x,int y)
{
	
	if( nivel[x] < nivel[y] )
		swap ( x , y ) ;
	int xnou = x ;
	while( nivel[xnou] > nivel[y] )
		xnou = tata[xnou] ;
	
	int ynou = y ;
	
	while( xnou != ynou )
	{
		xnou = tata[xnou] ;
		ynou = tata[ynou] ;
	}	

	return xnou ;
	
}

int main()
{
	
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	
	scanf("%d%d",&n,&t);
	nivel[1] = 1 ;
	for(int i=1;i<n;++i)
	{		
		scanf("%d",&tata[i+1]);
		nivel[i+1] = nivel[tata[i+1]] + 1 ;
	}	
	
	++ t ;
	while( -- t )
	{
		scanf("%d%d",&x,&y);
		int sol = lca ( x , y ) ;
		printf("%d\n",sol);
	}	
	
	return 0;
	
}