Cod sursa(job #393624)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 9 februarie 2010 19:00:51
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<cstdio>
#include<vector>
#define pb push_back
using namespace std;
#define minn(a,b) ((a<b)?a:b)
#define N 100005
int e[19][N<<1],n,m,x,y,dep[N],lung,jum,pr[N],log[N<<1];
int euler[N<<1],nr;
vector<int>arb[N];

void df(int x)
{
	euler[++nr] = x;
	if (!pr[x])
		pr[x]=nr;
	size_t g=arb[x].size(), y;
	for (size_t i=0; i<g; ++i)
	{
		y = arb[x][i];
		dep[y] = dep[x] + 1;
		df(y);
		euler[++nr] = x;
	}
}
void rmq()
{
	int i;
	log[2]=1;
	for (i=1;i<=nr;++i)
		e[0][i] = euler[i];
	for(i=3; i<=nr; ++i)
		log[i]=log[i>>1]+1;
	for (int i=1; i<=log[nr]; ++i)
	{
		lung=1<<i;
		jum=lung>>1;
		for(int j=1; j+lung-1<=nr; ++j)
			if(dep[e[i-1][j]]<dep[e[i-1][j+jum]])
				e[i][j]=e[i-1][j];
			else
				e[i][j]=e[i-1][j+jum];
	}
}
void solve()
{
	if (pr[x]>pr[y])
	{
		int aux = x;
		x = y;
		y = aux;
	}
	int dim=1<<log[pr[y]-pr[x]+1];
	int lo=log[pr[y]-pr[x]+1];
	if(dep[e[lo][pr[x]]]<dep[e[lo][pr[y]-dim+1]])
		x=e[lo][pr[x]];
	else
		x=e[lo][pr[y]-dim+1];
}
void citire()
{
	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);
		arb[x].pb(i);
	}
	df(1);
	/*for (int i=1; i<=nr; ++i)
		printf("%d %d\n",e[0][i],dep[0][i]);*/
	rmq();
	/*for (int i=0; i<=log[nr]; ++i)
	{
		for(int j=1; j<=nr; ++j)
			printf("%d ",dep[i][j]);
		printf("\n");
	}*/
	while (m--)
	{
		scanf("%d%d",&x,&y);
		solve();
		printf("%d\n",x);
	}
}
int main()
{
	citire();
	return 0;
}