Cod sursa(job #927206)

Utilizator dragangabrielDragan Andrei Gabriel dragangabriel Data 25 martie 2013 17:39:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<cstdio>
#include<algorithm>
#include<vector>
#define nmax 100005
using namespace std;
static int h=200;
int m,n,i,j,k,a[nmax],x,y,tata[nmax],niv[nmax];
vector<int>v[nmax];

void dfs(int nod,int n1,int lev)
{
	niv[nod]=lev;
	tata[nod]=n1;
	if (lev%h==0) n1=nod;
	for (int j=0;j<v[nod].size();j++)
		dfs(v[nod][j],n1,lev+1);
}

int lca(int x,int y)
{
	while (tata[x]!=tata[y])
		if (niv[x]>niv[y]) x=tata[x];else y=tata[y];
	while (x!=y)
		if (niv[x]>niv[y]) x=a[x];else y=a[y];
	return x;
}

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