Cod sursa(job #2777737)

Utilizator cyg_dawidDavid Ghiberdic cyg_dawid Data 24 septembrie 2021 01:31:17
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <cmath>

std::ifstream fin ("lca.in");
std::ofstream fout ("lca.out");

int const nmax = 250000;
int const pmax = 19;
int stramosi[pmax][nmax];
int level[nmax];
int n, m;

void build_stramosi () {
    int plim = log2(n);
    for (int p = 1; p <= plim; p++)
        for (int i = 1; i <= n; i++)
            stramosi[p][i] = stramosi[p - 1][stramosi[p - 1][i]];
}

void equilibrate (int& small, int& big) {
    int lim = log2(n);
    for (; lim >= 0; lim--) {
        if (level[stramosi[lim][small]] > level[big])
            small = stramosi[lim][small];
    }
    small = stramosi[0][small];
}

int main () {
    fin >> n >> m;
    for (int i = 2; i <= n; i++) {
        fin >> stramosi[0][i];
        level[i] = level[stramosi[0][i]] + 1;
    }
    build_stramosi();
    for (int i = m; i; i--) {
        int x, y;
        fin >> x >> y;
        if (level[x] > level[y])
            equilibrate (x, y);
        else if (level[x] < level[y])
            equilibrate (y, x);
        if (x == y) {
            fout << x << "\n";
            continue;
        }
        int plim = log2(n); int val = (1 << plim);
        for (; val; val >>= 1, plim--) {
            if (stramosi[plim][x] != stramosi[plim][y]) {
                x = stramosi[plim][x];
                y = stramosi[plim][y];
            }
        }
        fout << stramosi[0][x] << "\n";
    }
}