Cod sursa(job #2084670)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 9 decembrie 2017 11:23:44
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#define DM 100001
#include <cmath>
#include <fstream>
#include <vector>
using namespace std;

ifstream fi ("lca.in");
ofstream fo ("lca.out");
int n, m, a, b, prnt[DM], prt[DM], nvl[DM], md;//prt - parintii gruparii; nvl - nivelul nodului; md - sqrt de n(ce folosesc ca modulo); prnt - parintele propriu-zis
vector <int> v[DM];

void test2(int nod, int p, int n)//nod, parinte, nivel
{
	nvl[nod] = n;
	for (auto i:v[nod])
		if (i != p)
			test2(i, nod, n + 1);
}

void test1(int nod, int p, int g)//nod, parinte, nodul gruparii
{
	prt[nod] = g;
	if (nvl[nod]/md != nvl[p]/md)
		g = nod;
	for (auto i:v[nod])
		if (i != p)
			test1(i, nod, g);
}

int main()
{
	fi >> n >> m;
	prnt[1] = 1;
	for (int i = 2; i <= n; ++i)
	{
		fi >> prnt[i];
		v[prnt[i]].push_back(i);
		v[i].push_back(prnt[i]);
	}
	md = (int)(sqrt(n));
	test2(1, 0, 1);
	test1(1, 0, 1);
	for (int i = 1; i <= m; ++i)
	{
		fi >> a >> b;
		if (prt[a] != prt[b])
		{
			while (nvl[prt[a]] < nvl[prt[b]])
				b = prnt[prt[b]];
			while (nvl[prt[a]] > nvl[prt[b]])
				a = prnt[prt[a]];
		}
		if (prt[a] == prt[b])
		{
			while (nvl[b] > nvl[a])
				b = prnt[b];
			while (nvl[b] < nvl[a])
				a = prnt[a];
		}
		while (a != b)
			b = prnt[b], a = prnt[a];
		fo << a << '\n';
	}
	return 0;
}