Cod sursa(job #579991)

Utilizator cdascaluDascalu Cristian cdascalu Data 12 aprilie 2011 17:19:37
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
#include<vector>
#define Nmax 100005
#define lgMax 20
using namespace std;
int n,m,RMQ[lgMax][Nmax<<2],nr,loc[Nmax],lg[Nmax<<1],L[Nmax<<1],H[Nmax<<1];
vector<int> G[Nmax];
void df(int nod,int lev)
{
	H[++nr] = nod;
	L[nr] = lev;
	loc[nod] = nr;
	for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
	{
		df(*it,lev+1);
		H[++nr] = nod;
		L[nr] = lev;
	}
}
void rmq()
{
	int i,j,put;
	for(i=2;i<=nr;++i)
		lg[i]=lg[i/2]+1;
	for(i=1;i<=nr;++i)
		RMQ[0][i] = i;
	
	for(j=1;(1<<j)<=nr;++j)
		for(i=1;i+(1<<j)-1<=nr;++i)
		{
			put = (1<<j-1);
			RMQ[j][i] = RMQ[j-1][i];
			
			if(L[RMQ[j-1][i+put]]<L[RMQ[j][i]])
				RMQ[j][i] = RMQ[j-1][i+put];
		}
}
int querry(int x,int y)
{
	if(x>y)swap(x,y);
	int log = lg[y-x+1],sol;
	sol = RMQ[log][x];
	if(L[sol]>L[RMQ[log][y-(1<<log)+1]])
		sol = RMQ[log][y-(1<<log)+1];
	return H[sol];
}
int main()
{
	ifstream f("lca.in");
	f>>n>>m;
	int i,p,q,x;
	for(i=2;i<=n;++i)
	{
		f>>x;
		G[x].push_back(i);
	}
	df(1,1);
	rmq();
	ofstream g("lca.out");
	while(m--)
	{
		f>>p>>q;
		g<<querry(loc[p],loc[q])<<"\n";
	}
	f.close();
	g.close();
	return 0;
}