Cod sursa(job #3338448)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 3 februarie 2026 13:20:04
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

#define NMAX 100000
#define LOG2 17

vector <int> arb[NMAX + 1];
int salt[LOG2 + 1][NMAX + 1];
int lg[NMAX + 1];
int l[NMAX + 1];
int r[NMAX + 1];
int t = 0;

void set_logs(){
    lg[0] = lg[1] = 0;
    for (int i = 2; i <= NMAX; i++){
        lg[i] = lg[i / 2] + 1;
    }
}

void dfs(int node){
    t++;
    l[node] = t;
    for (auto neighbour : arb[node]){
        dfs(neighbour);
    }
    t++;
    r[node] = t;
}

void binary_lifting(int N){
    for (int p = 1; p <= lg[N]; p++){
        for (int i = 2; i <= N; i++){
            salt[p][i] = salt[p - 1][salt[p - 1][i]];
        }
    }
}

int e_stramos(int a, int b){
    return l[a] <= l[b] && r[b] <= r[a];
}

int lca(int a, int b, int N){
    if (e_stramos(a, b)){
        return a;
    }
    if (e_stramos(b, a)){
        return b;
    }
    for (int pas = lg[N]; pas >= 0; pas--){
        if (e_stramos(salt[pas][a], b) == 0 && salt[pas][a] != 0){
            a = salt[pas][a];
        }
    }
    return salt[0][a];
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    set_logs();
    int N, Q;
    fin >> N >> Q;
    for (int i = 1; i < N; i++){
        int x;
        fin >> x;
        arb[x].push_back(i + 1);
        salt[0][i + 1] = x;
    }
    salt[0][1] = 1;
    dfs(1);
    binary_lifting(N);
    for (int i = 1; i <= Q; i++){
        int a, b;
        fin >> a >> b;
        fout << lca(a, b, N) << '\n';
    }
    return 0;
}