Cod sursa(job #385392)

Utilizator GotenAmza Catalin Goten Data 22 ianuarie 2010 17:58:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream.h>
#include<iostream.h>

int v[100100][2],start[100100],eu[202000],q,k,x,n,m,padre[100100],lg[202000],
	a[18][202000],y,lo,l,ln[202000],beg[101000],viz[100100];

void dfs(int nod, int depth)
{
	int t;
	eu[++k]=nod;
	if(!viz[nod])
	{
		viz[nod]=1;
		beg[nod]=k;
	}
	ln[k]=depth;
	t=start[nod];
	while(t)
	{
		dfs(v[t][0],depth+1);
		t=v[t][1];
	}
	eu[++k]=padre[nod];
	ln[k]=depth-1;
}

int main()
{
	int i,j;
	ifstream f("lca.in");
	ofstream g("lca.out");
	f>>n>>m;
	for(i=2;i<=n;i++)
	{
		f>>x;
		padre[i]=x;
		v[++q][0]=i;
		v[q][1]=start[x];
		start[x]=q;
	}
	dfs(1,0);
	k--;
	lg[1]=0;
	lg[0]=-1;
	for(i=2;i<=k;i++)
		lg[i]=lg[i>>1]+1;
	for(i=1;i<=k;i++)
		a[0][i]=i;
	for(j=1;j<=lg[k];j++)
		for(i=1;j<=lg[k-i+1];i++)
			if(ln[a[j-1][i]]<ln[a[j-1][i+(1<<(j-1))]])
				a[j][i]=a[j-1][i];
			else
				a[j][i]=a[j-1][i+(1<<(j-1))];
	for(i=1;i<=m;i++)
	{
		f>>x>>y;
		x=beg[x];
		y=beg[y];
		if(x>y)
		{
			l=x;
			x=y;
			y=l;
		}
		l=y-x+1;
		lo=lg[l];
		if(ln[a[lo][x]]<ln[a[lo][y-(1<<lo)+1]])
			g<<eu[a[lo][x]]<<'\n';
		else
			g<<eu[a[lo][y-(1<<lo)+1]]<<'\n';
	}
	return 0;
}