Cod sursa(job #2978488)

Utilizator DKMKDMatei Filibiu DKMKD Data 13 februarie 2023 20:10:13
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100002
#define LMAX 18
using namespace std;
vector<int> v[NMAX];
int n, m, x, y, up[NMAX][LMAX], dp[NMAX];

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

void dfs(int nod) {
    for (auto vecin : v[nod]) {
        up[vecin][0] = nod;
        dp[vecin] = dp[nod] + 1;
        for (int j = 1; j < LMAX; j++) {
            up[vecin][j] = up[up[vecin][j - 1]][j - 1];
        }
        dfs(vecin);
    }
}

int lca(int a, int b) {
    if (dp[a] < dp[b]) {
        swap(a, b);
    }
    int k = dp[a] - dp[b];
    for (int j = LMAX - 1; j >= 0; j--) {
        if (k & (1 << j)) {
            a = up[a][j];
        }
    }
    if (a == b) {
        return a;
    }
    for (int j = LMAX - 1; j >= 0; j--) {
        if (up[a][j] != up[b][j]) {
            a = up[a][j];
            b = up[b][j];
        }
    }
    return up[a][0];
}

int main()
{
    fin >> n >> m;
    for (int i = 2; i <= n; i++) {
        fin >> x;
        if (x != i) {
            v[x].push_back(i);
        }
    }
    dp[1] = 1;
    dfs(1);
    for (int i = 1; i <= m; i++) {
        fin >> x >> y;
        fout << lca(x, y) << "\n";
    }
    return 0;
}