Cod sursa(job #368348)

Utilizator Mishu91Andrei Misarca Mishu91 Data 24 noiembrie 2009 19:13:29
Problema Lowest Common Ancestor Scor Ascuns
Compilator cpp Status done
Runda Marime 0.68 kb
#include <cstdio>

#define MAX_N 1005

int N, M, T[MAX_N], Niv[MAX_N];
char Tt[MAX_N][MAX_N];

void dfs(int nod, int niv)
{
	Niv[nod] = niv;

	for(int i = 1; i <= N; ++i)
		if(T[i] == nod)
			dfs(i, niv+1);
}

int main()
{
	freopen("lca.in","rt",stdin);
	freopen("lca.out","wt",stdout);

	scanf("%d %d\n", &N, &M);

	for(int i = 2; i <= N; ++i)
		scanf("%d ",T+i);

	for(int i = 1; i <= N; ++i)
		for(int j = i; j; j = T[j])
			Tt[i][j] = 1;

	dfs(1, 0);

	for(int i = 1; i <= M; ++i)
	{
		int x, y;
		scanf("%d %d\n",&x, &y);

		int nod = 0, hmax = 0;

		for(int j = 1; j <= N; ++j)
			if(Tt[x][j] && Tt[y][j])
				if(Niv[j] >= hmax) 
					nod = j,
					hmax = Niv[j];

		printf("%d\n", nod);
	}
}