Cod sursa(job #3285352)

Utilizator Octa-pe-infoNechifor Octavian Octa-pe-info Data 12 martie 2025 19:08:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

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

vector<vector<int>> rmq(100001,vector<int>(20,0)),tabel;
vector<int>h;

void dfs(int nod,int pr) {

    if(pr!=0) {
        h[nod] = h[pr]+1;
    }
    rmq[nod][0] = pr;

    for(auto i : tabel[nod]) {

        if(i != pr)
            dfs(i,nod);
    }
}

void build() {

    dfs(1,0);

    for(int i=1; i<=18; i++) {

        for(int j=1; j<=n; j++) {

            if(rmq[j][i-1] != 0)
                rmq[j][i] = rmq[rmq[j][i-1]][i-1];
            else rmq[j][i] = 0;
        }
    }
}


int query(int a,int b) {

    ///aducem pe a -> b

    if(h[a] < h[b])
        swap(a,b);

    int k = h[a] - h[b];

    for(int i=18; i>=0; i--) {

        if(k & (1<<i)) {
            a = rmq[a][i];
        }
    }

    if(a==b) {
        return b;
    }

    for(int i=18; i>=0; i--) {

        if(rmq[a][i] != rmq[b][i]) {

            a = rmq[a][i];
            b = rmq[b][i];
        }
    }

    return rmq[a][0];

}

int main() {

    int q;
    fin>>n>>q;

    tabel.resize(n+1);
    h.resize(n+1,0);

    for(int i=2; i<=n; i++) {

        int pr;
        fin>>pr;

        tabel[i].push_back(pr);
        tabel[pr].push_back(i);
    }

    build();

    while(q--) {

        int a,b;
        fin>>a>>b;

        fout<<query(a,b)<<"\n";
    }

    return 0;
}