Cod sursa(job #410441)

Utilizator otilia_sOtilia Stretcu otilia_s Data 4 martie 2010 13:24:00
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 100002
vector <int> F[NMAX];
short Niv[NMAX];
int T[NMAX][20];

void dfs(int nod, short niv)
{
	Niv[nod]=niv;
	for (int i=0;i<F[nod].size();++i)
	 dfs(F[nod][i],niv+1);
}

int lca(int x, int y)
{ 
	if (Niv[x]<Niv[y]) swap(x,y);
	
	int log1,log2;
	for (log1=0; (1<<log1)<Niv[x];++log1);
	for (log2=0; (1<<log2)<Niv[x];++log2);
	
	int k;
	for (k=log1;k>=0;--k)
	 if (Niv[x]-(1<<k) >= Niv[y]) x=T[x][k];
	
	if (x==y) return x;
	
	for (k=log2;k>=0;--k)
	 if (T[x][k] && T[x][k]!=T[y][k])
		 {
			x=T[x][k]; 
			y=T[y][k];
		 }
	
	return T[x][0];
}

int main()
{
	ifstream fin("lca.in"); ofstream fout("lca.out");
	int n,m,i;
	fin>>n>>m;
	for (i=2;i<=n;++i)
	{
		fin>>T[i][0];
		F[T[i][0]].push_back(i);
	}
	
	for(int k = 1; (1 << k)<=n; ++k)
	   for(i = 1; i<=n; ++i)
			T[i][k] = T[T[i][k-1]][k-1];
	
	dfs(1,0);
	
	while (m--)
	{ int x,y;
		fin>>x>>y;
		fout<<lca(x,y)<<"\n";
	}
	fin.close(); fout.close();
	return 0;
}