Cod sursa(job #1203748)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 1 iulie 2014 11:21:04
Problema Lowest Common Ancestor Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("lca.in");
ofstream o("lca.out");
int d[20][100000],l[100010],m,n,y,x;

int lca(int p,int q){

	if(l[p]<l[q])swap(p,q);//p este mai departe de radacina ca q
	int log1,log2;
	for( log1=1;(1<<log1)<=l[q];log1++);log1--;
	for( log2=1;(1<<log2)<=l[p];log2++);log2--;
	
	for(int i=log2;i>=0;i--)
	 if(l[p]-(1<<i) >= l[q])p=d[i][p];
	 
	if(p==q)return p;
	
	for(int i=log1;i>=0;i--)
	  if(d[i][p] != d[i][q]){
	  	p=d[i][p];q=d[i][q];
	  	
	  } 
	return d[0][p];
}

int main(){
	f>>n>>m;
	l[1]=0;
	d[0][1]=0;
	int lmax=0;
	for(int i=2;i<=n;i++)f>>d[0][i],l[i]=l[d[0][i]]+1,lmax=max(lmax,l[i]);
	
	for(int i=1;(1<<i)<=lmax;i++)
	 for(int j=1;j<=n;j++)
	  d[i][j] = d[i-1][d[i-1][j]];
		
	for(int i=1;i<=m;i++){
		f>>x>>y;
		o<<lca(x,y)<<endl;
	}
}