Cod sursa(job #738584)

Utilizator loginLogin Iustin Anca login Data 20 aprilie 2012 23:32:37
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
# include <fstream>
# include <iostream>
# include <vector>
# define DIM 100003
using namespace std;
int n, m, a[30][DIM], e[DIM], fs[DIM], l[DIM], ne, pow;
vector<int>G[DIM];

void df (int k)
{
	e[++ne]=k;
	fs[k]=ne;
	a[0][ne]=k;
	for(vector<int>::iterator I=G[k].begin();I!=G[k].end();++I)
	{
		df(*I);
		e[++ne]=k;
		a[0][ne]=k;
	}
}

void init ()
{
	int gata=0, p=1;
	while(!gata)
	{
		++pow;
		gata=1;
		for(int i=1;i<=ne;++i)
			if (a[p-1][a[p-1][i]])
			{
				if (l[a[p-1][i]]<l[a[p-1][a[p-1][i]]])
					a[p][i]=a[p-1][i];
				else
					a[p][i]=a[p-1][a[p-1][i]];
				gata=0;
			}
			
	}
}

int lca (int i, int j)
{
	int p=pow+1;
	while(i+(1<<p)>j)
		--p;
	if (l[a[p][i]]<l[a[p][j-(1<<p)+1]])
		return a[p][i];
	return a[p][j-(1<<p)+1];
}

int main ()
{
	ifstream fin ("lca.in");
	ofstream fout ("lca.out");
	fin>>n>>m;
	int x, y;
	for(int i=1;i<n;++i)
	{
		fin>>x;
		G[x].push_back(i);
	}
	df (1);
	init();
	for(;m--;)
	{
		fin>>x>>y;
		if (fs[x]<fs[y])
			fout<<lca(fs[x], fs[y])<<"\n";
		else
			fout<<lca(fs[y], fs[x])<<"\n";
	}
	return 0;
}