Cod sursa(job #1370662)

Utilizator alexb97Alexandru Buhai alexb97 Data 3 martie 2015 16:20:05
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 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;
vector <int> T2;
int n, m;
const int h = 200;
int a, b;

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

int main()
{
	is >> n >> m;
	g = vector <vector<int> > (n + 1);
	T = vector <int> (n + 1); 
	Lev = vector<int> (n + 1);
	T2 = vector<int> (n + 1);
	int x, y;
	for(int i = 2; i <= n; ++i)
	{
		is >> T[i];
	} 
	Df(1, 0, 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(T2[x] != T2[y])
        if(Lev[x] > Lev[y])
            x = T2[x];
        else
            y = T2[y];
	
	while(x != y)
	{
		if(Lev[x] > Lev[y])
			x = T[x];
		else
			y = T[y];
	} 
    return x;
}

void Df(int x, int lev, int t2)
{
	Lev[x] = lev;
	T2[x] = t2;
	if( lev % h == 0) t2 = n;
	for(int i = 1; i <= n; ++i)
	{
		if(T[i] == x)
			Df(i, lev+1, t2);
	} 
	return;
}