Cod sursa(job #1069680)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 30 decembrie 2013 13:34:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include<vector>
#define pb push_back
#include <math.h> 
using namespace std;
const int  nmax = 108000;

//vector < int > a[nmax];

int n,m,T[nmax],P[nmax][100],L[nmax];//,h=0;

void dfs(){
    int i,j;
    for(i=0;i<=n;i++)
     for(j=0;1<<j<=n;j++)P[i][j]=-1;
    
	for(i=1;i<=n;i++)P[i][0]=T[i];
	
	for(j=1;1<<j<=n;j++)
	  for(i=1;i<=n;i++)
	   if(P[i][j-1]!=-1 )
	    P[i][j] = P[P[i][j-1]][j-1];
}



int lca(int x,int y){

int log,i;
if(L[x]<L[y])swap(x,y);

for(log=1;1<<log<=L[x];log++);log--;


for(i=log;i>=0;i--)
 if(L[x] -(1<<i)>=L[y])x=P[x][i];
 
 if(x==y)return x;
 
 for(i=log;i>=0;i--)
  if (P[x][i]!=-1 && P[x][i]!=P[y][i]){
  	 x = P[x][i]  ; y = P[y][i] ;
  }
  
   
   return T[x];

}

int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%ld%ld",&n,&m);
int x,y;
T[1]=1;
L[1]=0;
for(int i=2;i<=n;i++){
scanf("%d",&T[i]);
L[i] = L[T[i]]+1;
//if(L[i]>h)h=L[i];
//a[T[i]].pb(i);
}
dfs();
/*
	for(int j=0;j<=n;j++)
 {
          for(int i=0;1<<i<n;i++)printf("%d ",P[j][i]);
          printf("\n");
 }
*/

//printf("%d\n",lca(4,6));


for(int i=1;i<=m;i++){
	scanf("%d %d",&x,&y);
	printf("%d\n",lca(x,y));
}


fclose(stdout); fclose(stdin);
return 0;
}