Cod sursa(job #2195831)

Utilizator flibiaVisanu Cristian flibia Data 17 aprilie 2018 14:16:13
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>
#define N 100100

using namespace std;

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

int n, m, x, y, vf, rmq[19][2 * N], st[2 * N], D[N], ap[N];
bitset <N> viz;
vector <int> v[N];

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

int main(){
	in >> n >> m;
	for(int i = 2; i <= n; i++){
		in >> x;
		v[x].push_back(i);
	}
	dfs(1, 1);
	for(int i = 1; i <= vf; i++)
		rmq[0][i] = st[i];
	int sz = log2(vf);
	for(int pw = 1; pw <= sz; pw++)
		for(int j = 1; j <= vf; j++)
			rmq[pw][j] = (D[rmq[pw - 1][j]] < D[rmq[pw - 1][j + (1 << (pw - 1))]] ? rmq[pw - 1][j] : rmq[pw - 1][j + (1 << (pw - 1))]);	
	while(m--){
		in >> x >> y;
		if(ap[x] > ap[y])
			swap(x, y);
		sz = log2(ap[y] - ap[x] + 1);
		out << (D[rmq[sz][ap[x]]] < D[rmq[sz][ap[y] - (1 << sz) + 1]] ? rmq[sz][ap[x]] : rmq[sz][ap[y] - (1 << sz) + 1]) << '\n';
	}
	return 0;
}