Cod sursa(job #739863)

Utilizator alexa_mihaltanMihaltan Alexandra alexa_mihaltan Data 23 aprilie 2012 23:32:43
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#define dim 200001
using namespace std;
int euler[dim], nivel[dim];
int n, m, lungime=0;
int rmq[20][dim];
vector<int> fii[dim];
void Euler_si_Nivel(int nod)
{
	int i;
	euler[++lungime]=nod;
	nivel[nod] = lungime;
	for (i=0; i<(int)fii[nod].size(); 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, ny, i;
	nx = nivel[x];
	ny = nivel[y];
	if (nx>ny) swap(nx, ny);
	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;
}