Cod sursa(job #3308897)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 29 august 2025 15:19:32
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 rad, par[100005];
int jump[100005], h[100005];

void get_jump(int v) {
    jump[v] = v;
    for (int i = 1; i <= rad; i++)
        jump[v] = par[jump[v]];
}

int solve(int u, int v) {
    if (h[u] < h[v])
        swap(u, v);
    while (h[u] - h[v] >= rad)
        u = jump[u];
    while (h[u] != h[v])
        u = par[u];
    if (u == v) return u;
    while (jump[v] != jump[u]) {
        u = jump[u];
        v = jump[v];
    }
    while (u != v) {
        u = par[u];
        v = par[v];
    }
    return u;
}

int main() {

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

    int n, q;
    cin >> n >> q;
    rad = sqrt(n);
    h[1] = 1;
    for (int i = 2; i <= n; i++) {
        cin >> par[i];
        h[i] = h[par[i]] + 1;
    }
    for (int i = 1; i <= n; i++)
        get_jump(i);
    while (q--) {
        int u, v;
        cin >> u >> v;
        cout << solve(u, v) << '\n';
    }
    return 0;
}