Cod sursa(job #1319583)

Utilizator h2g2Ford Prefect h2g2 Data 17 ianuarie 2015 10:24:34
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;

int n, m, x, y, parent[nmax], level[nmax];

void explore(int x) {
	if(level[x]) return;

	explore(parent[x]);
	level[x] = level[parent[x]] + 1;
}

int lca(int x, int y) {
	while(level[x] > level[y]) x = parent[x];
	while(level[y] > level[x]) y = parent[y];

	while(x != y) {
		x = parent[x];
		y = parent[y];
	}
	
	return x;
}


int main() {
	ifstream f("lca.in");
	ofstream g("lca.out");

	f>>n>>m;
	for(int i=2; i<=n; i++) f>>parent[i];
	level[1] = 1;

	for(int i=2; i<=n; i++) explore(i);	

	for(int i=1; i<=m; i++) {
		f>>x>>y;
		g<<lca(x, y)<<"\n";
	}

/*
	for(int h=1; h<=4; h++) {
		for(int i=1; i<=n; i++)
			if(level[i] == h) cout<<i<<" ";
		cout<<"\n";
	}
*/

	return 0;
}