Cod sursa(job #373511)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 13 decembrie 2009 22:46:08
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#define MaxN 100001

using namespace std;
fstream fin ("lca.in",ios::in);
fstream fout("lca.out",ios::out);

struct nod {
	int x;
	nod *urm;
};

int n, m, viz[MaxN], k, parc[MaxN<<2], dep[MaxN<<2];
nod *L[MaxN];

void add_nod(int ex1, int ex2){

	nod *p = new nod;
	nod *q = new nod;

	p->x = ex2;
	p->urm = L[ex1];
	L[ex1] = p;

	q->x = ex1;
	q->urm = L[ex2];
	L[ex2] = q;
};

void euler_det(int x, int depth){ //dfs euler

		viz[x] = 1;
		parc[++k] = x;
		dep[k] = depth;
		for (nod *p = L[x]; p != NULL; p = p->urm)
			if (!viz[p->x]){
				euler_det(p->x, depth + 1);
				parc[++k] = x;
				dep[k] = depth;
			};
				
	
};
int query(int x1, int x2){

	int s1, s2, min;
	for (int i = 1; i <= k; i++){
		if (parc[i] == x1) {
			s1 = i;
		} else {
			if (parc[i] == x2) s2 = i;
		};
	};
	if (s1 <= s2){
		min = s1;
		for (int i = s1; i <= s2; i++)
			if (dep[i] < dep [min])
				min = i;
	}
	if (s1 > s2){
		min = s2;
		for (int i = s2; i <= s1; i++)
			if (dep[i] < dep [min])
				min = i;
	}
	return parc[min];
};

int main(){
	
	int x, x1, x2;
	
	fin>>n>>m;
	for (int i = 2; i <= n; ++i){
		fin>>x;
		add_nod(i, x);
	};

	euler_det(1, 0);
	/*for (int i = 1; i <= k; ++i)
		fout<<parc[i]<<" ";
	fout << '\n';
	for (int i = 1; i <= k; ++i)
		fout<<dep[i]<<" ";
	fout << '\n';*/
	
	for (int i = 1; i <= m; ++i){
		fin>>x1>>x2;
		fout<<query(x1, x2)<<'\n';
	};
	
	return 0;
};