Cod sursa(job #485747)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 19 septembrie 2010 13:41:47
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
#include <vector>
using namespace std;
#define nmax 100010

vector <int> v[nmax];
int n, m, l, e[2*nmax], r[20][2*nmax], f[2*nmax], lg[20];

void dfs (int nod)
{
	e[++l]=nod;
	f[nod]=l;
	if (v[nod].size())
	{
		dfs(v[nod].back());
		v[nod].pop_back();
		dfs(nod);
	}
}

void rmq()
{
	int i, j;
	for (i=2; i<=l; i++) lg[i]=lg[i>>1]+1;
	for (i=1; i<=l; i++) r[0][i]=e[i];
	for (i=1; 1<<i<l; i++)
		for (j=1; j<=l; j++) r[i][j]=min(r[i-1][j], r[i-1][j+(1<<(i-1))]);
}

void lca()
{
	int x, y, d;
	while (m--)
	{
		scanf("%d %d",&x,&y);
		x=f[x];
		y=f[y];
		if (x>y)
		{
			d=x;
			x=y;
			y=d;
		}
		d=lg[y-x+1];
		printf("%d\n",min (r[d][x], r[d][y-(1<<d)+1]));
	}
}

int main()
{
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i, x;
	for (i=2; i<=n; i++)
	{
		scanf("%d",&x);
		v[x].push_back(i);
	}
	dfs(1);
	rmq();
	lca();
}