Cod sursa(job #739853)

Utilizator alexa_mihaltanMihaltan Alexandra alexa_mihaltan Data 23 aprilie 2012 23:12:22
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>
using namespace std;
#define dim 20000001
int euler[dim],nivel[dim];
int n,m,lungime=0;
int rmq[20][dim];
vector <int> fii[dim];
void Euler_si_Nivel(int nod)
{
	euler[++lungime]=nod;
	nivel[nod]=lungime;
	int numarFii=fii[nod].size();
	for(int i=0;i<numarFii;++i)
	{
		Euler_si_Nivel(fii[nod][i]);
		euler[++lungime]=nod;
	}
}
void RMQ()
{
	for(int i=1;i<lungime;++i)
		rmq[0][i]=euler[i];
	for(int i=1;(1<<i)<=lungime;++i)
		for(int j=1;j<=lungime-(1<<i)+1;++j)
			rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);

}
int lca(int x,int y)
{
	int nx=nivel[x];
	int ny=nivel[y];
	if (nx>ny) swap(nx,ny);
	int i;
	for(i=1;(1<<i)<=(ny-nx+1);++i)
		--i;
	return min(rmq[i][nx],rmq[i][ny-(1<<i)+1]);
}
int main()
{
	ifstream fin("lca.in");
	ofstream fout("lca.out");
	fin>>n;
	fin>>m;
	int x,y;
	for(int i=2;i<=n;++i)
		{
		fin>>x;
		fii[x].push_back(i);
		}
	Euler_si_Nivel(1);
	RMQ();
	for(int i=1;i<=m;++i)
	{
		fin>>x;
		fin>>y;
		fout<<lca(x,y)<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}