Cod sursa(job #1212936)

Utilizator pulseOvidiu Giorgi pulse Data 26 iulie 2014 16:38:34
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.63 kb
#include <cstdio>
#define nmax 100005

using namespace std;

int n, m, T[nmax], Lev[nmax];

void dfs(int node, int k)
{
	Lev[node] = k;

	for (int i = 1; i <= n; ++i)
	{
		if (T[i] == node)
			dfs(i, k + 1);
	}
}

int main()
{
	freopen("lca.in", "r", stdin);
	freopen("lca.out", "w", stdout);

	scanf("%d%d", &n, &m);
	for (int i = 1; i < n; ++i)
	{
		int x;
		scanf("%d", &x);
		T[i + 1] = x;
	}

	dfs(1, 0);

	for (; m; --m)
	{
		int x, y;
		scanf("%d%d", &x, &y);

		while (x != y)
		{
			if (Lev[x] > Lev[y])
				x = T[x];
			else
				y = T[y];
		}
		printf("%d\n", x);
	}

	return 0;
}