Cod sursa(job #2351739)

Utilizator flibiaVisanu Cristian flibia Data 22 februarie 2019 17:43:45
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, x, y, dad[100100], dp[20][100100], niv[100100], viz[100100];
vector <int> v[100100];
 
void dfs(int x, int lvl) {
	viz[x] = 1;
	niv[x] = lvl;
	for (auto y : v[x])
		if (!viz[y])
			dfs(y, lvl + 1);
}

void build() {
	for (int i = 1; i <= n; i++)
		dp[0][i] = dad[i];
	for (int i = 1; i <= 16; i++)
		for (int j = 1; j <= n; j++)
			dp[i][j] = dp[i - 1][dp[i - 1][j]];
}

void solve(int x, int y) {
	if (niv[x] < niv[y])
		swap(x, y);
	int d = niv[x] - niv[y];
	for (int i = 0; i <= 16; i++)
		if (d & (1 << i))
			x = dp[i][x];
	for (int i = 16; i >= 0; i--)
		if (dp[i][x] != dp[i][y]) {
			x = dp[i][x];
			y = dp[i][y];
		}
	if (x != y)
		x = dad[x];
	out << x << '\n';
}

int main() {
	in >> n >> m;
	for (int i = 2; i <= n; i++) {
		in >> x;
		dad[i] = x;
		v[x].push_back(i);
	}	
	dfs(1, 1);
	build();
	while (m--) {
		in >> x >> y;
		solve(x, y);
	}
	return 0;
}