Cod sursa(job #2292709)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 29 noiembrie 2018 21:00:49
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;


const int NMAX = 100010;
vector <int> adia[NMAX + 10];
int h[NMAX + 10];
int link[NMAX + 10], lant[NMAX + 10], cnt;
int g[NMAX + 10];
vector <pair <int, int>> not_used;

void dfs(int nod, int t)
{
	g[nod] = 1;
	h[nod] = 1 + h[t];
	int best_fiu = 0;
	for (auto i : adia[nod]) {
		dfs(i, nod);
		g[nod] += g[i];
		if (g[i] > g[best_fiu])
			best_fiu = i;
	}
	if (best_fiu)
		lant[nod] = lant[best_fiu], link[lant[nod]] = t;
	else
		lant[nod] = ++cnt, link[lant[nod]] = t;
}

int lca(int a, int b)
{
	while (1) {
		if (lant[a] == lant[b])
			return (h[a] < h[b] ? a : b);
		if (h[link[lant[a]]] > h[link[lant[b]]])
			a = link[lant[a]];
		else
			b = link[lant[b]];
	}
}

int main()
{
    FILE *in = fopen("lca.in", "r");
    FILE *out = fopen("lca.out", "w");

    int n, m, t;
    fscanf(in, "%d%d", &n, &m);
    for (int i = 2; i <= n; i++) {
        fscanf(in, "%d", &t);
        adia[t].push_back(i);
    }
    dfs(1, 0);

    while (m--) {
        int a, b;
        fscanf(in, "%d%d", &a, &b);
        fprintf(out, "%d\n", lca(a, b));
    }
	return 0;
}