Cod sursa(job #1442478)

Utilizator MciprianMMciprianM MciprianM Data 25 mai 2015 17:15:00
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
#include <cstring>

using namespace std;

static const int MAXN = 100009;
int n;
int dad[MAXN];
int level[MAXN];

int getLevel(int nod)
{
	if(level[nod] == -1)
	{
		level[nod] = getLevel(dad[nod]) + 1;
	}
	return level[nod];
}

int main()
{
	int m, x, y;
	ifstream f("lca.in");
	ofstream g("lca.out");
	f >> n >> m;
	for(int i = 2; i <= n; i++)
	{
		f >> dad[i];
	}
	memset(level, -1, sizeof(level));
	level[1] = 0;
	for(int i = 1; i <= n; i++)
	{
		level[i] = getLevel(i);
	}
	for(int i = 0; i < m; i++)
	{
		f >> x >> y;
		while(x != y)
		{
			if(level[x] == level[y])
			{
				x = dad[x];
				y = dad[y];
			}
			else if(level[x] > level[y])
			{
				x = dad[x];
			}
			else if(level[x] < level[y])
			{
				y = dad[y];
			}
		}
		g << x << '\n';
	}
	f.close();
	g.close();
	return 0;
}