Cod sursa(job #739730)

Utilizator StrajanStrajan Sebastian Ioan Strajan Data 23 aprilie 2012 20:02:36
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
#include<vector>
#define MAX 200100
using namespace std;

int n, m, rmq[10][MAX];
int eu[MAX], niv[MAX];
vector<int> g[MAX];

void dfs(int nod){
	int i;
	eu[++eu[0]]=nod;
	niv[nod] = eu[0];
	for (i=0; i<(int)g[nod].size(); i++)	{
		dfs(g[nod][i]);
		eu[++eu[0]] = nod;
	}	
}

void Rmq(){
	for (int i=1; i<eu[0]; i++)
		rmq[0][i] = eu[i];
	
	for (int i=1; (1<<i)<=eu[0]; i++)
		for (int j=1; j<=eu[0]-(1<<i)+1; ++j)
			rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);	
}

int query(int a, int b){
	int x, y, i;
	x = niv[a];
	y = niv[b];
	
	if (x>y) swap(x, y);
	
	for (i=1; (1<<i)<=(y-x+1); i++);
		i--;
	return min(rmq[i][x], rmq[i][y-(1<<i)+1]);
}

int main(){
	ifstream fin("lca.in");
	ofstream fout("lca.out");
	fin>>n>>m;
		
	int a, b;
	for (int i=2; i<=n; i++){
		fin>>a;
		g[a].push_back(i);
	}	
	dfs(1);
	Rmq();	
	for (int i=1; i<=m; i++){
		fin>>a>>b;
		fout<<query(a, b)<<"\n";
	}
	
	fin.close();
	fout.close();
	return 0;
}