Cod sursa(job #739497)

Utilizator NistorIoanaNistor Ioana- Anamaria NistorIoana Data 23 aprilie 2012 11:29:45
Problema Lowest Common Ancestor Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <vector>
using namespace std;


ifstream f ("lca.in");
ofstream g ("lca.out");
#define DIM 200100
int n,m,rmq[20][DIM];
int euler[DIM],nivel[DIM];
vector<int> a[DIM];

void dfs(int);
void rmq2();
int query(int, int); 

int main(){
	int b, c,i;
	f>>n>>m; 
	for(i=2;i<=n;++i){
		f>>b;
		a[b].push_back(i);
	}
	dfs(1);
	rmq2();
	for(i=1;i<=m;++i){
		f>>b>>c;
		g<<query(b,c)<<endl;
	} 
	f.close();
	g.close();
	return 0;
}

void dfs(int nod){
	int i;
	euler[++euler[0]]=nod;
	nivel[nod]=euler[0];
	for(i=0;i<(int)a[nod].size();++i){
		dfs(a[nod][i]);
		euler[++euler[0]] = nod;
	}
}

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

int query(int b, int c){
	int x,y,i;
	x=nivel[b];
	y=nivel[c]; 
	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]);
}