Cod sursa(job #1370587)

Utilizator alexb97Alexandru Buhai alexb97 Data 3 martie 2015 15:56:49
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is("lca.in");
ofstream os("lca.out");

vector<vector<int> > g;
vector <int> t;
vector <int> Lev;
int n, m;
int a, b;

int Lca(int x, int y);
void Df(int x, int lev);

int main()
{
	is >> n >> m;
	g = vector <vector<int> >(n + 1);
	t = vector <int>(n+1); 
	Lev = vector<int> (n+1);
	int x, y;
	for(int i = 2; i <= n; ++i)
	{
		is >> t[i];
	} 
	Df(1, 0);
	for(int i = 1; i <= m; ++i)
	{
		is >> x >> y;
		os << Lca(x, y) << '\n';
	}
	is.close();
	os.close();
	return 0;
}

int Lca(int x, int y)
{
	while(x != y)
	{
		if(Lev[x] > Lev[y])
			x = t[x];
		else
			y = t[y];
	}
	return x;
}

void Df(int x, int lev)
{
	Lev[x] = lev;
	for(int i = 1; i <= n; ++i)
	{
		if(t[i] == x)
			Df(i, lev+1);
	} 
	return;
}