Cod sursa(job #2722755)

Utilizator FrostfireMagirescu Tudor Frostfire Data 13 martie 2021 11:47:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define NMAX 100000

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int n, m, k, nivel[NMAX+10], rmq[19][2*NMAX+10], fa[NMAX+10];
vector <int> nod[NMAX+10];

void dfs(int x, int p)
{	k++;
	fa[x] = k;
	rmq[0][k] = x;
	nivel[x] = nivel[p] + 1;
	for(auto u : nod[x])
		if(u != p)
			{	dfs(u, x);
				k++;
				rmq[0][k] = x;
			}
}

int solveRMQ(int x, int y)
{	if(nivel[x] <= nivel[y]) return x;
	return y;
}

int main()
{
	fin >> n >> m;
	for(int i=2; i<=n; i++)
		{	int x;
			fin >> x;
			nod[x].push_back(i);
		}
	dfs(1, 0);
	for(int bit=1; (1<<bit)<=k; bit++)
		for(int i=1; i<=k-(1<<bit)+1; i++)
			rmq[bit][i] = solveRMQ(rmq[bit-1][i], rmq[bit-1][i+(1<<(bit-1))]);
	while(m--)
		{	int x, y;
			fin >> x >> y;
			x = fa[x];
			y = fa[y];
			if(x > y) swap(x, y);
			int len = y - x + 1, bit = (int)log2(len);
			fout << solveRMQ(rmq[bit][x], rmq[bit][y-(1<<bit)+1]) << '\n';
		}
	return 0;
}