Cod sursa(job #3231303)

Utilizator RakoRacovita Dennis Gabriel Rako Data 25 mai 2024 16:50:38
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")

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{
            v = query(v, d2 - d1);
        }
        
        if(u == v){
            cout << u << '\n';
            continue;
        }

        for(i = 19; i >= 0; i--){
            if(bl[i][u] != bl[i][v]){
                u = bl[i][u];
                v = bl[i][v];
            }
        }
        cout << bl[0][u] << '\n';

    }

    return 0;
}