Cod sursa(job #579982)

Utilizator cdascaluDascalu Cristian cdascalu Data 12 aprilie 2011 17:12:32
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
#include<vector>
#define Nmax 100001
#define lgMax 20
using namespace std;
int n,m,RMQ[lgMax][Nmax<<2],nr,loc[Nmax<<1],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;
	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)
		{
			RMQ[j][i] = RMQ[j-1][i];
			if(L[RMQ[j-1][i+1]]<L[RMQ[j][i]])
				RMQ[j][i] = RMQ[j-1][i+1];
		}
}
int querry(int x,int 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);
		lg[i] = lg[i/2]+1;
	}
	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;
}