Cod sursa(job #1442480)

Utilizator MciprianMMciprianM MciprianM Data 25 mai 2015 17:32:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cstring>

using namespace std;

static const int MAXN = 100009;
static const int RMAX = 300;
int n;
int dad[MAXN];
int rdad[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;
	dad[1] = 1;
	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 = 1; i <= n; i++)
	{
		int father = dad[i];
		while(level[father] % RMAX != 0)
		{
			father = dad[father];
		}
		rdad[i] = father;
	}
	for(int i = 0; i < m; i++)
	{
		f >> x >> y;
		while(rdad[x] != rdad[y])
		{
			if(level[x] == level[y])
			{
				x = rdad[x];
				y = rdad[y];
			}
			else if(level[x] > level[y])
			{
				x = rdad[x];
			}
			else if(level[y] > level[x])
			{
				y = rdad[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[y] > level[x])
			{
				y = dad[y];
			}
		}
		g << x << '\n';
	}
	f.close();
	g.close();
	return 0;
}