Cod sursa(job #1143179)

Utilizator vladrochianVlad Rochian vladrochian Data 14 martie 2014 21:22:26
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <vector>
using namespace std;
int n,m,k,p[20],f[100001],e[200001],l[200001],lg[200001],rmq[20][400001];
vector<int> g[100001];
void dfs(int nod,int lv)
{
	e[++k]=nod;
	l[k]=lv;
	f[nod]=k;
	for(size_t i=0;i<g[nod].size();++i)
	{
		dfs(g[nod][i],lv+1);
		e[++k]=nod;
		l[k]=lv;
	}
}
int lca(int a,int b)
{
	int d,i,x,y;
	a=f[a];
	b=f[b];
	if(a>b)
		swap(a,b);
	d=b-a+1;
	i=lg[d];
	d-=p[i];
	x=rmq[i][a];
	y=rmq[i][a+d];
	return e[(l[x]<l[y])?x:y];
}
ifstream fin("lca.in");
ofstream fout("lca.out");
int main()
{
	int i,j,d,x,y;
	fin>>n>>m;
	for(i=2;i<=n;++i)
	{
		fin>>x;
		g[x].push_back(i);
	}
	dfs(1,0);
	p[0]=1;
	for(i=1;i<20;++i)
		p[i]=p[i-1]<<1;
	rmq[0][1]=1;
	for(i=2;i<=k;++i)
	{
		rmq[0][i]=i;
		lg[i]=lg[i>>1]+1;
	}
	for(i=1;p[i]<k;++i)
		for(j=1;j<=k-p[i];++j)
		{
			d=p[i-1];
			x=rmq[i-1][j];
			y=rmq[i-1][j+d];
			rmq[i][j]=(l[x]<l[y])?x:y;
		}
	while(m--)
	{
		fin>>x>>y;
		fout<<lca(x,y)<<"\n";
	}
	return 0;
}