Cod sursa(job #751273)

Utilizator ChallengeMurtaza Alexandru Challenge Data 25 mai 2012 10:16:26
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>

using namespace std;

const char InFile[]="lca.in";
const char OutFile[]="lca.out";
const int MaxN=100111;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,M,x,y,niv[MaxN],lant[MaxN],tata_lant[MaxN],g[MaxN];
vector<int> A[MaxN];

void DFS(int nod)
{
	g[nod]=1;
	
	if(A[nod].empty())
	{
		lant[nod]=++lant[0];
		return;
	}
	
	int gmax=0;
	for(vector<int>::iterator it=A[nod].begin();it!=A[nod].end();++it)
	{
		int vcn=*it;
		niv[vcn]=niv[nod]+1;
		DFS(vcn);
		tata_lant[lant[vcn]]=nod;
		g[nod]+=g[vcn];
		if(g[gmax]<g[vcn])
		{
			gmax=vcn;
		}
	}
	lant[nod]=lant[gmax];
}

inline int LCA(int x, int y)
{
	while(lant[x]!=lant[y])
	{
		if(niv[tata_lant[lant[x]]]>niv[tata_lant[lant[y]]])
		{
			x=tata_lant[lant[x]];
		}
		else
		{
			y=tata_lant[lant[y]];
		}
	}
	if(niv[x]<niv[y])
	{
		return x;
	}
	return y;
}

int main()
{
	fin>>N>>M;
	for(register int i=2;i<=N;++i)
	{
		fin>>x;
		A[x].push_back(i);
	}
	niv[1]=1;
	DFS(1);
	tata_lant[lant[1]]=0;
	for(register int i=1;i<=M;++i)
	{
		fin>>x>>y;
		fout<<LCA(x,y)<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}