Cod sursa(job #760417)

Utilizator matei_cChristescu Matei matei_c Data 21 iunie 2012 11:52:34
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;

#define maxn 100001

int n,t ;
int tata[maxn] ;
int nivel[maxn] ;
int parc[maxn] ;
int x,y ;
int nr ;
int sel[maxn] ;
int num ;
vector <int> vecini[maxn] ;

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 ;
	
}

void parcurgere(int nod)
{
	parc[++nr] = nod ;
	sel[nod] = 1;
	for(size_t i=0;i<vecini[nod].size();++i)
		if( sel[vecini[nod][i]] == 0 )
		{
			parcurgere(vecini[nod][i]) ;
			parc[++nr] = nod ;
		}	

	
}

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]);
		vecini[i+1].push_back(tata[i+1]) ;
		vecini[tata[i+1]].push_back(i+1) ;
		nivel[i+1] = nivel[tata[i+1]] + 1 ;
	}	
	
	sel[1] = 1 ;
	num =  1 ;
	parcurgere(1) ;
	for(int i=1;i<=nr;++i)
		printf("%d\n",parc[i]);
	
	++ t ;
	while( -- t )
	{
		scanf("%d%d",&x,&y);
		int sol = lca ( x , y ) ;
		//printf("%d\n",sol);
	}	
	
	return 0;
	
}