Cod sursa(job #808011)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 6 noiembrie 2012 05:22:09
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <vector>

using namespace std;

inline int next_int() {
	int d;
	scanf("%d", &d);
	return d;
}

int N, M;
vector<int> G[111111];
int P[111111], chain[111111], size[111111], depth[111111], seen[111111], heavy[111111];

void dfs(int u, int d) {
	if (seen[u]) {
		return;
	}
	seen[u] = true;
	size[u] = 1;
	depth[u] = d;
	chain[u] = u;
	for (size_t i = 0; i < G[u].size(); i++) {
		int v = G[u][i];
		dfs(v, d + 1);
		size[u] += size[v];
	}
}

void get_chain(int u) {
	chain[u] = heavy[u] ? chain[P[u]] : u;
	for (size_t i = 0; i < G[u].size(); i++) {
		int v = G[u][i];
		get_chain(v);
	}
}

int lca(int u, int v) {
	while (chain[u] != chain[v]) {
		if (depth[chain[u]] < depth[chain[v]]) {
			v = P[chain[v]];
		} else {
			u = P[chain[u]];
		}
	}
	return depth[u] < depth[v] ? u : v;
}

int main() {
	freopen("lca.in", "r", stdin);
	freopen("lca.out", "w", stdout);
	N = next_int();
	M = next_int();
	for (int i = 2; i <= N; i++) {
		P[i] = next_int();
	}
	for (int i = 1; i <= N; i++) {
		G[P[i]].push_back(i);
	}
	dfs(1, 0);
	get_chain(1);
	for (int i = 0; i < M; i++) {
		int u = next_int();
		int v = next_int();
		printf("%d\n", lca(u, v));
	}
	return 0;
}