Cod sursa(job #579943)

Utilizator cdascaluDascalu Cristian cdascalu Data 12 aprilie 2011 16:41:19
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<fstream>
#include<vector>
#define Nmax 100001
#define lgMax 20
using namespace std;
int n,m,euler[lgMax][2*Nmax],nr,loc[Nmax],lg[Nmax];
vector<int> G[Nmax];
void df(int nod)
{
	++nr;
	euler[0][nr] = nod;
	loc[nod] = nr;
	for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();++it)
	{
		df(*it);
		euler[0][++nr] = nod;
	}
}
void rmq()
{
	int i,j,put;
	for(j=1;(1<<j)<=nr;++j)
	{
		put = 1<<j;
		for(i=1;i+put-1<=nr;++i)
			euler[j][i] = min(euler[j-1][i], euler[j-1][i+put/2]);
	}
}
int querry(int x,int y)
{
	int log = lg[y-x+1];
	return min(euler[log][x], euler[log][y-(1<<log)+1]);
}
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);
	rmq();
	ofstream g("lca.out");
	while(m--)
	{
		f>>p>>q;
		g<<querry(loc[p],loc[q])<<"\n";
	}
	f.close();
	g.close();
	return 0;
}