Cod sursa(job #938628)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 13 aprilie 2013 10:04:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
using namespace std;

ifstream fi ("lca.in");
ofstream fo ("lca.out");

const int dim = 100005;
int N, M, X, Y, index, T[dim], comp[dim], nrelem[dim], capat[dim], niv[dim];
vector <int> V[dim];

void cit ()
{
	fi >> N >> M;
	for (int i = 2; i <= N; i++)
	{
		fi >> T[i];
		V[T[i]].push_back (i);
	}	
}

void dfs (int n, int t)
{
	niv[n] = niv[t] + 1;
	comp[n] = ++index;
	nrelem[comp[n]] = 0;
	
	for (int i = 0, f; i < V[n].size(); i++)
	{
		f = V[n][i];
		dfs (f, n);
		if (nrelem[comp[f]] > nrelem[comp[n]])
		{
			comp[n] = comp[f];
		}
	}
	
	for (int i = 0, f; i < V[n].size(); i++)
	{
		f = V[n][i];
		if (comp[f] != comp[n])
		{
			capat[comp[f]] = f;
		}
	}
	
	nrelem[comp[n]] ++;
}

void urca (int &n)
{
	n = T[ capat[ comp[n] ] ];
}

void rez ()
{
	dfs (1, 0);
	capat[comp[1]] = 1;
	
	while (M --)
	{
		fi >> X >> Y;
		while (comp[X] != comp[Y])
		{
			if (niv[capat[comp[X]]] > niv[capat[comp[Y]]])
				urca (X);
			else
				urca (Y);
		}
		fo << (niv[X] < niv[Y] ? X : Y) << '\n';
	}
}

void afi ()
{
	
}

int main ()
{
	cit ();
	rez ();
	afi ();
	
	return 0;
}