Cod sursa(job #2846671)

Utilizator tibinyteCozma Tiberiu-Stefan tibinyte Data 9 februarie 2022 14:59:14
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<vector<int>> rmq;
vector<vector<int>> g;
vector<int> tin;
vector<int> tout;
int n, q,cnt;
void dfs(int node, int parent) {
    rmq[node][0] = parent;
    for (int i = 1; i <= 19; ++i) {
        rmq[node][i] = rmq[rmq[node][i - 1]][i - 1];
    }
    tin[node] = cnt++;
    for (auto i : g[node]) {
        if (i != parent) {
            dfs(i, node);
        }
    }
    tout[node] = cnt++;
}
int lca(int a, int b) {
    auto ancestor = [&](int a, int b) {
        return (tin[a] <= tin[b] && tout[a] >= tout[b]);
    };
    for (int i = 19; i >= 0; --i) {
        if (!ancestor(rmq[a][i], b)) {
            a = rmq[a][i];
        }
    }
    return rmq[a][0];
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    fin >> n >> q;
    g = vector<vector<int>>(n + 1);
    rmq = vector<vector<int>>(n + 1, vector<int>(20));
    tin = tout = vector<int>(n + 1);
    for (int i = 2; i <= n; ++i) {
        int x;
        fin >> x;
        g[x].push_back(i);
        g[i].push_back(x);
    }
    dfs(1, 1);
    while (q--) {
        int a, b;
        fin >> a >> b;
        fout << lca(a, b) << '\n';
    }
}