Cod sursa(job #769480)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 19 iulie 2012 15:59:46
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<fstream>
#include<vector>
#define dim 100007
using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");
int eul[3*dim],pr[dim],A[3*dim][20];
int i,j,n,m,x,y,k,pow[3*dim],w;
vector<int>G[dim];
void dfs(int nod)  {
	
	eul[++k]=nod;
	pr[nod]=k;
	for(int i=0;i<G[nod].size();++i){
		dfs(G[nod][i]);
		eul[++k]=nod;
	}
}
int min(int a ,int b){
	if(a<b)
		return a;
	return b;
}
int main () {
	
	f>>n>>m;
	
	
	for(i=2;i<=n;i++){
		
		f>>x;
		G[x].push_back(i);
	}
	
	dfs(1);
	for(i=2;i<=k;++i)
		pow[i]=pow[i/2]+1;
	for(i=1;i<=k;i++){
		A[i][0]=eul[i];
	}
	for(i=1; (1<<i)<=k; ++i ) {

		for(j=1; j+(1<<i)-1<=k ;++j){
			
			A[j][i]=min(A[j][i-1],A[j+(1<<(i-1))][i-1]);
			
		}
	}		
	
	
	for (i=1;i<=m;i++){
		f>>x>>y;
		
		x=pr[x];
		y=pr[y];
		if(x>y)
			swap(x,y);
		w=pow[y-x+1];
		g<<min(A[x][w],A[y-(1<<w)+1][w])<<"\n";
		
	}
	return 0;
}