Cod sursa(job #716136)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 18 martie 2012 12:54:02
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#define nmax 100001
using namespace std;
int n,m,niv[nmax],dad[nmax],gp[nmax],x,y,h;
vector<int>v[nmax];
void dfs(int nod)
{
	if(niv[nod]<h)
		gp[nod]=1;
	else
		if(!niv[nod]%h)
			gp[nod]=dad[nod];
		else
			gp[nod]=gp[dad[nod]];
	for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
		dfs(*it);
}
int main()
{
	int i;
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d%d", &n, &m);
	niv[1]=0;
	dad[1]=-1;
	h=0;
	for(i=2;i<=n;i++)
	{
		scanf("%d", &x);
		v[x].push_back(i);
		dad[i]=x;
		niv[i]=niv[x]+1;
		if(niv[i]>h)
			h=niv[i];
	}
	h=(int)sqrt((double)h);
	dfs(1);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d", &x,&y);
		while(gp[x]!=gp[y])
			if(niv[x]>niv[y])
				x=gp[x];
			else
				y=gp[y];
		while(x!=y)
			if(niv[x]>niv[y])
				x=dad[x];
			else
				y=dad[y];
		printf("%d\n", x);
	}
	return 0;
}