Cod sursa(job #3201253)

Utilizator raresgherasaRares Gherasa raresgherasa Data 7 februarie 2024 11:44:24
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;

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

const int NM = 1e5 + 5;

int up[NM][20];
int n, m, sz, l;
vector<int>g[NM];
int in[4 * NM], out[4 * NM];

void dfs (int nod, int dad = 1) {
    in[nod] = ++sz;
    up[nod][0] = dad;
    for (int i = 1; i <= l; i++) {
        up[nod][i] = up[up[nod][i - 1]][i - 1];
    }
    for (int u : g[nod]) {
        if (u != dad) {
            dfs(u, nod);
        }
    }
    out[nod] = ++sz;
}

bool is_ancestor (int u, int v) {
    return in[u] <= in[v] && out[u] >= out[v];
}

int query (int u, int v) {
    if (is_ancestor(u, v)) {
        return u;
    }
    if (is_ancestor(v, u)) {
        return v;
    }
    for (int i = l; i >= 0; i--) {
        if (!is_ancestor(up[u][i], v)) {
            u = up[u][i];
        }
    }
    return up[u][0];
}

int main() {
    fin >> n >> m;
    l = ceil(log2(n));
    for (int i = 2; i <= n; i++) {
        int x; fin >> x;
        g[x].push_back(i);
    }
    dfs(1);
    while (m--) {
        int x, y;
        fin >> x >> y;
        fout << query(x, y) << '\n';
    }
}