Cod sursa(job #2896960)

Utilizator matthriscuMatt . matthriscu Data 1 mai 2022 18:37:12
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 100005
#define LOGMAX 30
#define problem "lca"

vector<int> G[NMAX];
int path[2 * NMAX], last[NMAX], t, rmq[LOGMAX][2 * NMAX], lg[2 * NMAX];

void dfs(int n) {
	last[n] = ++t;
	rmq[0][t] = n;

	for (int neigh : G[n])
		if (!last[neigh]) {
			dfs(neigh);
			last[n] = ++t;
			rmq[0][t] = n;
		}
}

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

	int n, m;
	scanf("%d%d", &n, &m);

	for (int i = 2, x; i <= n; ++i) {
		scanf("%d", &x);
		G[x].push_back(i);
		G[i].push_back(x);
	}

	dfs(1);

	for (int i = 2; i <= 2 * n - 1; ++i)
		lg[i] = lg[i / 2] + 1;

	for (int i = 1; (1 << i) <= 2 * n - 1; ++i)
		for (int j = 1; j + (1 << i) <= 2 * n - 1; ++j)
			rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);

	for (int i = 1, x, y; i <= m; ++i) {
		scanf("%d%d", &x, &y);
		int left = min(last[x], last[y]), right = max(last[x], last[y]), lg_len = lg[right - left];
	
		printf("%d\n", min(rmq[lg_len][left], rmq[lg_len][right - (1 << lg_len)]));
	}
}