Cod sursa(job #948333)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 9 mai 2013 22:59:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<fstream>
#include<algorithm>
using namespace std;

int d[100001][18],t[100001],l[100001],i,n,m,j,x,y,z;

int lev(int x)
{
	if (l[x]==0)
		l[x]=lev(t[x])+1;
	return l[x];
}

int main()
{
	ifstream f("lca.in");
	ofstream g("lca.out");
	f >> n >> m;
	for (i=2;i<=n;i++)
		f >> t[i];
	l[1]=1;
	for (i=2;i<=n;i++)
		if (l[i]==0)
			l[i]=lev(i);
	for (i=2;i<=n;i++)
		d[i][0]=t[i];
	for (i=1;i<=n;i++)
		for (j=1;j<=17;j++)
			d[i][j]=d[d[i][j-1]][j-1];
	for (i=1;i<=m;i++)
	{
		f >> x >> y;
		if (l[x]<l[y])
			swap(x,y);
		z=l[x]-l[y];
		for (j=0;j<=17;j++)
			if (((1 << j) & z)>0)
				x=d[x][j];
		if (x==y)
		{
			g << x << "\n";
			continue;
		}
		for (j=17;j>=0;j--)
			if (d[x][j]!=d[y][j])
			{
				x=d[x][j];
				y=d[y][j];
			}
		g << t[x] << "\n";
	}
	return 0;
}