Cod sursa(job #714271)

Utilizator fhandreiAndrei Hareza fhandrei Data 15 martie 2012 17:02:31
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
//Include
#include <fstream>
#include <vector>
using namespace std;

//Constante
const int MAX_SIZE = (int)1e5+1;

//Functii
void dfs(int x);

//Variabile
ifstream in("lca.in");
ofstream out("lca.out");

int n, q;
int nivel[MAX_SIZE], tata[MAX_SIZE];
vector<int> graf[MAX_SIZE];

//Main
int main()
{
	in >> n >> q;
	for(int i=2 ; i<=n ; ++i)
		in >> tata[i], graf[tata[i]].push_back(i);
	
	dfs(1);
	
	int nod1, nod2;
	for(int i=1 ; i<=q ; ++i)
	{
		in >> nod1 >> nod2;
		while(nivel[nod1] > nivel[nod2])
			nod1 = tata[nod1];
		while(nivel[nod2] > nivel[nod1])
			nod2 = tata[nod2];
		
		while(nod1 != nod2)
			nod1 = tata[nod1], nod2 = tata[nod2];
		
		out << nod1 << '\n';
	}
	
	in.close();
	out.close();
	return 0;
}

void dfs(int x)
{
	vector<int>::iterator it, end;
	end=graf[x].end();
	
	for(it=graf[x].begin(); it!=end ; ++it)
		nivel[*it] = nivel[x] + 1, dfs(*it);	
}