Cod sursa(job #739616)

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

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

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

int lca (int i, int j)
{
	int p=pow;
	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=2;i<=n;++i)
	{
		fin>>x;
		G[x].push_back(i);
	}
	l[1]=1;
	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;
}