Cod sursa(job #3152701)

Utilizator AndPitAndreeaPiticar AndPit Data 26 septembrie 2023 13:01:40
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <vector>
#define int long long
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nMax = 1e5 + 1;
const int logN = 20;
vector<int>G[nMax];
int up[nMax][logN];
int timer;
int in[nMax], out[nMax];
void dfs(int u = 1, int par = 1) {
    in[u] = ++timer;
    up[u][0] = par;
    for (int i = 1; i < logN; ++i) {
        up[u][i] = up[up[u][i - 1]][i - 1];
    }
    for (auto i : G[u]) {
        if (i != par)
            dfs(i, u);
    }
    out[u] = ++timer;
}
bool ancestor(int u, int v) {
    return in[u] <= in[v] && out[u] >= out[v];
}
int lca(int u, int v) {
    if (ancestor(u, v))
        return u;
    if (ancestor(v, u))
        return v;
    for (int i = logN - 1; i >= 0; --i) {
        if (!ancestor(up[u][i], v))
            u = up[u][i];
    }
    return up[u][0];
}
int32_t main() {
    int n, q;
    f >> n >> q;
    for (int i = 2; i <= n; ++i) {
        int x;
        f >> x;
        G[x].push_back(i);
        G[i].push_back(x);
    }
    dfs();
    while (q--) {
        int a, b;
        f >> a >> b;
        g << lca(a, b) << '\n';
    }
    return 0;
}