Cod sursa(job #2286487)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 20 noiembrie 2018 13:10:25
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>

#include<iostream>
#include<fstream>

using namespace std;

typedef struct nod{
	int value;
	int nivel;
	nod* parent;
}nod;

#define MAXN 100000

nod* noduri[MAXN];

int M,N;

int lca(nod *A,nod* B){
	if(A==B)
		return A->value;
	if(A==noduri[0] || B==noduri[0])
		return 1;

	while(A->nivel > B->nivel){
		A=A->parent;
	}
	while(B->nivel > A->nivel){
		B=B->parent;
	}

	while(A!=B){
		A=A->parent;
		B=B->parent;
	}
	return A->value;
}

int main(){
	
	freopen("lca.in", "r", stdin);
	freopen("lca.out", "w", stdout);

	scanf("%d %d", &N,&M);
	noduri[0]=new nod;
	noduri[0]->value=1;
	noduri[0]->nivel=1;
	noduri[0]->parent=NULL;

	int aux;
	for(int i=1;i<N;i++){
		scanf("%d", &aux);
		noduri[i]=new nod;
		noduri[i]->value=i+1;
		noduri[i]->parent=noduri[aux-1];
		noduri[i]->nivel=noduri[aux-1]->nivel+1;
	}

	int x,y,rez;
	for(int i=0;i<M;i++){
		scanf("%d %d",&x,&y);
		rez=lca(noduri[x-1],noduri[y-1]);
		printf("%d\n",rez);
	}
	
	return 0;
}