Cod sursa(job #528888)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 3 februarie 2011 18:41:53
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>
#include <vector>

using namespace std;

#define file_in "lca.in"
#define file_out "lca.out"

#define nmax 101000

int N,M,x,y;
int i,T[nmax];
vector<int> G[nmax];
int Lev[nmax];
int T2[nmax];

int Lca(int x, int y){
	
	while(T2[x]!=T2[y])
		 if (Lev[x]>Lev[y])
			 x=T2[x];
		 else
			 y=T2[y];
	while(x!=y)	
		 if (Lev[x]>Lev[y])
			 x=T[x];
		 else
			 y=T[y];

	return x;

}

void dfs(int nod, int t2, int niv){
	
	T2[nod]=t2;
	Lev[nod]=niv;
	if (niv%200==0)
		t2=nod;
	vector<int> :: iterator it;
	
	
	for (it=G[nod].begin();it!=G[nod].end();++it)
		 dfs(*it,t2,niv+1);
}

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &N, &M);
	for (i=2;i<=N;++i){
		scanf("%d", &T[i]);
		G[T[i]].push_back(i);
	}
	
	dfs(1,0,0);
	
	while(M--){
		
		scanf("%d %d", &x, &y);
		printf("%d\n", Lca(x,y));
	}
	
	return 0;
	
}