Cod sursa(job #673223)

Utilizator razvan2006razvan brezulianu razvan2006 Data 4 februarie 2012 09:10:57
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

int i,j,n,k,lm,m,d[300010][51],nr=0,prim[100010],rang[300010],x,y;
vector<int> a[100010];
void euler(int nod)
{
	d[++nr][0]=nod;
	prim[nod]=nr;
	for(int i=0;i<a[nod].size();++i)
	{
		euler(a[nod][i]);
		d[++nr][0]=nod;
	}
}
int main()
{
	FILE *f=fopen("lca.in","r");
	FILE *g=fopen("lca.out","w");
	fscanf(f,"%d%d",&n,&m);
	for(i=2;i<=n;++i)
	{
		fscanf(f,"%d",&j);
		a[j].push_back(i);
	}
	euler(1);
	rang[0]=0;
	for(i=2;i<=nr;++i)
		rang[i]=rang[i/2]+1;
	for(i=1;(1<<i)<=nr;++i)
	{
		lm=nr-(1<<i)+1;
		k=1<<(i-1);
		for(j=1;j<=lm;++j)
			d[j][i]=min(d[j][i-1],d[j+k][i-1]);
	}
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d%d",&x,&y);
		if(prim[x]<prim[y])
			x=prim[x],y=prim[y];
		else
		{
			int aux=x;
			x=prim[y],y=prim[aux];
		}
		k=rang[y-x+1];
		lm=(y-x+1)-(1<<k);
		int min1=min(d[x][k],d[x+lm][k]);
		fprintf(g,"%d\n",min1);
	}
	return 0;
}