Cod sursa(job #2098152)

Utilizator flibiaVisanu Cristian flibia Data 2 ianuarie 2018 14:41:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
#define N 100100

using namespace std;

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

struct lol{
	int mn, lca;
};

int n, m, x, y, vf, stk[2 * N], poz[N], d[N];
vector <int> v[N]; 
lol rmq[19][2 * N];
bool viz[N];

void dfs(int from, int lvl){
	viz[from] = 1;
	d[from] = lvl;
	stk[++vf] = from;
	poz[from] = vf;
	for(auto to : v[from])
		if(!viz[to]){
			dfs(to, lvl + 1);
			stk[++vf] = from;
		}
}

void build(){
	for(int j = 1; j <= vf; j++)
		rmq[0][j] = {d[stk[j]], stk[j]};
	int sz = log2(vf);
	for(int i = 1; i <= sz; i++)
		for(int j = 1; j <= vf; j++)
			rmq[i][j] = (rmq[i - 1][j].mn < rmq[i - 1][j + (1 << (i - 1))].mn ? rmq[i - 1][j] : rmq[i - 1][j + (1 << (i - 1))]);
}

void solve(){
	in >> x >> y;
	x = poz[x];
	y = poz[y];
	if(x > y)
		swap(x, y);
	int dist = y - x + 1;
	int sz = log2(dist);
	out << (rmq[sz][x].mn < rmq[sz][y - (1 << sz) + 1].mn ? rmq[sz][x].lca : rmq[sz][y - (1 << sz) + 1].lca) << '\n';
}

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