Cod sursa(job #409947)

Utilizator test9cTester test9c Data 3 martie 2010 22:31:35
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<stdio.h>
#define nmax 100010
int rmq[25][nmax<<1],eu[nmax<<1], lvl[nmax<<1], ap[nmax], log[nmax<<1], n, m, i, lmax;
struct elem
{	int v; elem *nxt;
}	*a[nmax], *q;

void read()
{	int i, x;
	scanf("%d%d", &n, &m);
	for(i=2; i<=n; i++)
	{	scanf("%d", &x);
		q=new elem;
		q->v=i;
		q->nxt=a[x];
		a[x]=q;
	}
}

void dfs(int x, int k)
{	elem *q;
	q=a[x];
	lmax++; eu[lmax]=x;
	lvl[lmax]=k; ap[x]=lmax;
	while(q)
	{	dfs(q->v, k+1);
		q=q->nxt;
		lmax++; eu[lmax]=x;	lvl[lmax]=k;
	}
}

int min(int x, int y)
{	if(lvl[x]<lvl[y])	return x;
	else				return y;
}

void create_rmq()
{	int i, j;
	for(i=1; i<=lmax; i++)	rmq[0][i]=i;
	for(j=1; (1<<j)<=lmax; j++)
		for(i=1; i+(1<<j)<=lmax; i++)
			rmq[j][i]=min(rmq[j-1][i], rmq[j-1][i+(1<<(j-1))]);
}

int lca(int x, int y)
{	int temp, k;
	x=ap[x]; y=ap[y];
	if(x>y)
	{	temp=x; x=y; y=temp;}
	k=log[y-x+1];
	temp=min(rmq[k][x], rmq[k][y+1-(1<<k)]);
	return eu[temp];
	
}

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