Cod sursa(job #1069362)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 29 decembrie 2013 21:31:52
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include<vector>
#define pb push_back
#include <math.h> 
using namespace std;
const int  nmax = 100000;

vector < int > a[nmax];

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

void dfs(int nod){
	if(nod<nr)
	 P[nod]=1;
	 else if(!(nod%nr))
	 P[nod] = T[nod];
	 else
	 P[nod]=P[T[nod]];
	 for(int i=0;i<a[nod].size();i++)
	  dfs(a[nod][i]);
}

int lca(int x,int y){

	while(P[x]!=P[y])
	 if(L[x]>L[y])
	  x=T[x];
	  else y=T[y];
	  	
	  while(x!=y)
	  if(L[x]>L[y])x=T[x];
	  else y=T[y];
	  
	  return x;
}

int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%ld%ld",&n,&m);
int x,y;
P[1]=1;
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);
}
nr = trunc(sqrt(h));
dfs(1);
	
//for(int i=1;i<=n;i++)	printf("%d ",L[i]);
//printf("%d\n",lca(2,3));
//for(int i=1;i<=n;i++)	printf("%d ",P[i]);
for(int i=1;i<=m;i++){
	scanf("%d %d",&x,&y);
	printf("%d\n",lca(x,y));
}


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