Cod sursa(job #3286395)

Utilizator mihaihvhTuburlui Mihai mihaihvh Data 14 martie 2025 09:52:04
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>

#define NMAX 100000

using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

const int log = 18;
int up[NMAX + 1][log];
vector<int> g[NMAX + 1];
vector<int> viz;
int n, q;

void dfs(int nod) {
    for (auto i : g[nod]) {
        if (!viz[i]) {
            viz[i] = viz[nod] + 1;
            up[i][0] = nod;
            for (int j = 1; j < log; ++j)
                up[i][j] = up[up[i][j - 1]][j - 1];
            dfs(i);
        }
    }
}

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

int main() {
    viz.resize(NMAX + 1);
    cin >> n >> q;
    
    for (int val, i = 2; i <= n; ++i) {
        cin >> val;
        g[val].push_back(i);
        g[i].push_back(val);
    }
    viz[1] = 1;
    dfs(1);
    for (int a, b, i = 1; i <= q; ++i) {
        cin >> a >> b;
        cout << lca(a, b) << '\n';
    }
    return 0;;
}