Cod sursa(job #3308891)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 29 august 2025 14:36:05
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>

using namespace std;

int bl[17][100005], height[100005];

int solve(int u, int v) {
    if (height[u] < height[v])
        swap(u, v);
    int dif = height[u] - height[v];
    for (int b = 0; b < 17; b++) {
        if (dif & (1 << b))
            u = bl[b][u];
    }
    if (u == v) return u;
    for (int b = 16; b >= 0; b--) {
        if (bl[b][u] != bl[b][v]) {
            u = bl[b][u];
            v = bl[b][v];
        }
    }
    return bl[0][u];
}

int main() {

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

    int n, q;
    cin >> n >> q;
    height[1] = 1;
    for (int i = 2; i <= n; i++) {
        cin >> bl[0][i];
        height[i] = height[bl[0][i]] + 1;
    }
    for (int i = 1; (1 << i) < n; i++) {
        for (int j = 1; j <= n; j++) {
            bl[i][j] = bl[i - 1][bl[i - 1][j]];
        }
    }
    while (q--) {
        int u, v;
        cin >> u >> v;
        cout << solve(u, v) << '\n';
    }
    return 0;
}