Cod sursa(job #846805)

Utilizator test_13testing test_13 Data 2 ianuarie 2013 19:47:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstring>
#include <vector>
#include <deque>
#include <queue>
#include <set>
using namespace std;
#define inf 0xffffff
#define Max 100001

vector<int>g[Max];
int n,m,a[2*Max],niv[2*Max],p[Max],k,c[2*Max][20];

void dfs(int x,int l)
{
	a[++k]=x;
	niv[k]=l;
	for(int i=0;i<g[x].size();i++)
	{
		dfs(g[x][i],l+1);
		a[++k]=x;
		niv[k]=l;
	}
}

void rmq()
{
	for(int j=1;(1<<j)<=k;j++)
    for(int i=1;i+(1<<j)-1<=k;i++)
		if(niv[c[i][j-1]]<niv[c[i+(1<<(j-1))][j-1]])
			c[i][j]=c[i][j-1]; else c[i][j]=c[i+(1<<(j-1))][j-1];

}

int main()
{
	int x,y;
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
		scanf("%d %d",&n,&m);
		for(int i=2;i<=n;i++)
		{
			scanf("%d",&x);
			g[x].push_back(i);
		}
		dfs(1,0);
		//for(int i=1;i<=k;i++)printf("%d ",a[i]);
		for(int i=1;i<=k;i++)
		{
			c[i][0]=i;
			if(p[a[i]]==0)p[a[i]]=i;
		}
		rmq();
		//for(int i=1;i<=k;i++)printf("(%d,%d) ",i,niv[i]);
		for(int i=1;i<=m;i++)
		{
			scanf("%d %d",&x,&y);
			x=p[x]; y=p[y];
			if(x>y)swap(x,y);
			k=log(double(y-x+1))/log(double(2));
			if(niv[c[x][k]]<niv[c[y-(1<<k)+1][k]])k=c[x][k]; else k=c[y-(1<<k)+1][k];
			printf("%d\n",a[k]);
		}
	return 0;
}