Cod sursa(job #2722721)

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

using namespace std;

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

int n, q, dp[17][(1<<17)+10], nivel[NMAX+10];
vector <int> nod[NMAX+10];

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

int lca(int x, int y)
{	if(nivel[x] < nivel[y]) swap(x, y);
	int dif = nivel[x] - nivel[y];
	for(int bit=0; (1<<bit)<=dif; bit++)
		if(dif & (1 << bit))
			x = dp[bit][x];
	if(x == y)
		return x;
	for(int bit=16; bit>=0; bit--)
		if(dp[bit][x] != dp[bit][y])
			{	x = dp[bit][x];
				y = dp[bit][y];			
			}
	return dp[0][x];
}

int main()
{
	fin >> n >> q;
	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)<=n; bit++)
		for(int i=1; i<=n; i++)
			dp[bit][i] = dp[bit-1][dp[bit-1][i]];
	while(q--)
		{	int x, y;
			fin >> x >> y;
			fout << lca(x, y) << '\n';
		}
	return 0;
}