Cod sursa(job #2806904)

Utilizator lucamLuca Mazilescu lucam Data 23 noiembrie 2021 10:11:16
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
	
#include <vector>
	
using namespace std;
	
 
	
ifstream in("lca.in");
	
ofstream out("lca.out");
	
 
	
int n, m, a[20][100001], lg2[100001], lvl[100001];
	
vector<int> g[100001];
	
 
	
void read()
	
{
	
	in >> n >> m;
	
	for(int i = 2; i <= n; ++i) {
	
		in >> a[0][i];
	
		g[a[0][i]].push_back(i);}
	
}
	
 
	
void prec()
	
{
	
	for(int i = 2; i <= n; ++i)
	
		lg2[i] = lg2[i/2] + 1;
	
	for(int i = 1; (1<<i) <= n; ++i)
	
		for(int j = 1; j <= n; ++j)
	
			a[i][j] = a[i-1][a[i-1][j]];
	
}
	
 
	
void dfs(int nod)
	
{
	
	for(auto i : g[nod]) {
	
		lvl[i] = lvl[nod] + 1;
	
		dfs(i);
	}
	
}
	
 
	
int lca(int x, int y)
	
{
	
	if(lvl[x] < lvl[y])
	
		swap(x, y);
	
	while(lvl[x] != lvl[y]) {
	
		x = a[lg2[lvl[x] - lvl[y]]][x];
	}
	
	if(x == y) {
	
		return x;
	}
	
 
	
	for(int i = lg2[lvl[x]]; i >= 0; --i)
	
		if(a[i][x] != a[i][y]) {
	
			x = a[i][x];
	
			y = a[i][y];
		}
	
	return a[0][x];
	
}
	
 
	
void afis()
	
{
	
	dfs(1);
	
	int x, y;
	
	while(m--) {

		in >> x >> y;
	
		out << lca(x, y) << '\n';
	}
	
}
	
 
	
int main()
	
{
	
	read();
	
	prec();
	
	afis();
	
	return 0;
	
}