Cod sursa(job #2286532)

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

#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

#define MAXN 100000

typedef struct nod{
	vector<int> fii;
	vector<int> eticheta;
}nod;

nod noduri[MAXN];

int M,N;

int lca(int a,int b){
	vector<int> va=noduri[a].eticheta;
	vector<int> vb=noduri[b].eticheta;
	int la=va.size();
	int lb=vb.size();
	if(la==0 || lb==0)
		return 0;
	int n=0;
	int value=0;
	while(n<la && n<lb && va[n]==vb[n]){
		value=noduri[value].fii[va[n]];
		n++;
	}
	return value;
}

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

	scanf("%d %d", &N,&M);

	int aux;
	for(int i=1;i<N;i++){
		scanf("%d", &aux);
		noduri[i].eticheta=noduri[aux-1].eticheta;
		noduri[i].eticheta.push_back(noduri[aux-1].fii.size());	
		noduri[aux-1].fii.push_back(i);
	}

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