Cod sursa(job #675968)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 8 februarie 2012 15:18:01
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
using namespace std;

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

const int dim = 100005, logn = 18;
int T[logn][dim], niv[dim], viz[dim], n, m, a, b;

void cit ()
{
	fi >> n >> m;
	for (int i = 2; i <= n; i++)
	{
		fi >> T[0][i];
	}
	for (int i = 1; i <= logn; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			T[i][j] = T[i-1][T[i-1][j]];
		}
	}
	niv[1] = viz[1] = 1;
}

int dfs (int n)
{
	if (viz[n] == 0)
	{
		viz[n] = 1;
		niv[n] = dfs (T[0][n]) + 1;
	}	
	return niv[n];
}

int cauta (int a, int b)
{
	int x;
	if (niv[a] > niv[b])
		{ x = a; a = b; b = x; }
	
	x = niv[b] - niv[a];
	for (int r = 0; x; r++)
	{
		if (x & 1)
			b = T[r][b];
		x >>= 1;
	}
	if (a == b)
		return a;
	
	for (int r = logn-1; r >= 0; r--)
	{
		if (T[r][a] != T[r][b])
		{
			a = T[r][a];
			b = T[r][b];
		}		
	}
	
	return T[0][a];
}

int main ()
{
	cit ();
	for (int i = 2; i <= n; i++)
		dfs (i);
	
	while ( m-- )
	{
		fi >> a >> b;
		fo << cauta (a, b) << '\n';
	}
	
	return 0;
}