Cod sursa(job #3231288)

Utilizator RakoRacovita Dennis Gabriel Rako Data 25 mai 2024 16:21:33
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5 + 69;
int bl[20][NMAX];
int dep[NMAX];
int n, m;

int query(int u, int k){
    int r = u;
    for(int i = 0; i < 20; i++){
        if(k & (1 << i)) r = bl[i][r];
    }
    return r;
}

int depth(int u){
    return dep[u] ? dep[u] : dep[u] = depth(bl[0][u]) + 1;
}

int main(){

    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);

    dep[1] = 1;
    bl[0][1] = 1;
    cin >> n >> m;
    for(int i = 2; i <= n; i++){
        cin >> bl[0][i];
    }

    for(int j = 1; j < 20; j++){
        for(int i = 1; i <= n; i++){
            bl[j][i] = bl[j-1][bl[j-1][i]];
        }
    }

    while(m--){
        int u, v, i, d1, d2;
        cin >> u >> v;
        d1 = depth(u);
        d2 = depth(v);
        if(d1 > d2){
            u = query(u, d1 - d2);
        }else{
            u = query(u, d2 - d1);
        }
        
        int st = 0, dr = depth(u) - 1, mij;
        while(st < dr){
            mij = (st + dr) / 2;
            if(query(u, mij) == query(v, mij)){
                dr = mij;
            }else{
                st = mij + 1;
            }
        }

        cout << query(u, st) << '\n';

    }

    return 0;
}