Cod sursa(job #3306425)

Utilizator razvanmrt_06Mariuta Razvan razvanmrt_06 Data 10 august 2025 14:44:01
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int Nmax = 100005;

int n, m, top, dp[Nmax][25], log2[Nmax], first[Nmax];
//dp[i][j] = idx nodului cu depth min in E[] inc de la i cu lung 2^j

vector<int> L[Nmax];
vector<pair<int, int>> E;
int lenE;

void preCalc(){
    log2[1] = 0;
    for(int i = 2; i <= Nmax; i++){
        log2[i] = log2[i/2] + 1;
    }
}

void dfs(int nod, int niv){
    E.push_back({nod, niv});
    first[nod] = E.size() - 1;
    for(auto vec : L[nod]){
        dfs(vec, niv+1);
        E.push_back({nod, niv});
    }
}

void RMQ(){
    for(int i = 0; i < lenE; i++){
        dp[i][0] = i;
    }

    for(int p = 1; p <= 20; p++){
        for(int i = 1; i < lenE; i++){
            dp[i][p] = dp[i][p-1];
            int j = i + (1 << (p-1));
            if(j < lenE && E[dp[i][p]].second > E[dp[j][p-1]].second){
                dp[i][p] = dp[j][p-1];
            }
        }
    }
}

int solve(int nod1, int nod2){
    int st = min(first[nod1], first[nod2]);
    int dr = max(first[nod1], first[nod2]);

    int dif = dr - st + 1;
    int p = log2[dif];
    int jum = (1 << p);

    return min(dp[st][p], dp[dr - jum + 1][p]);
}

int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    fin >> n >> m;
    for(int i = 2; i <= n; i++){
        int aux;
        fin >> aux;
        L[aux].push_back(i);
    }
    preCalc();
    dfs(1, 0);
    lenE = E.size();
    RMQ();

    while(m--){
        int u, v;
        fin >> u >> v;
        int sol = solve(u, v);
        cout << E[sol].first << "\n";
    }

    return 0;
}