Cod sursa(job #1413493)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 1 aprilie 2015 21:49:42
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int maxn = 100005;
const int maxlg = 25;

int n, m, anc[maxlg][maxn], level[maxn];

inline int query(int x, int y) {
	if(level[x] < level[y])
		swap(x, y);
	int diff = level[x] - level[y];
	for(int i = 0 ; i < maxlg ; ++ i)
		if(diff & (1 << i))
			x = anc[i][x];
	if(x == y)
		return x;
	for(int i = maxlg - 1 ; i >= 0 ; -- i)
		if(anc[i][x] != anc[i][y]) {
			x = anc[i][x];
			y = anc[i][y];
		}
	return anc[0][x];
}

inline void solve_stramosi() {
	fin >> n >> m;
	level[1] = 1;
	for(int i = 2 ; i <= n ; ++ i) {
		fin >> anc[0][i];
		level[i] = level[anc[0][i]] + 1;
	}
	for(int i = 1 ; i < maxlg ; ++ i)
		for(int j = 1 ; j <= n ; ++ j)
			anc[i][j] = anc[i - 1][anc[i - 1][j]];
	for(int i = 1 ; i <= m ; ++ i) {
		int x, y;
		fin >> x >> y;
		fout << query(x, y) << '\n';
	}
}

int main() {
	solve_stramosi();
	///solve_hpd();
	///solve_rmq();
	///solve_aint();
}