Cod sursa(job #2715551)

Utilizator bem.andreiIceman bem.andrei Data 3 martie 2021 20:28:10
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("lca.in");
ofstream w("lca.out");
int n, m, stramos[20][100003], adancime[100003];
vector<int>g[100003];
void dfs(int nod, int niv){
    for(auto it: g[nod]){
        dfs(it, niv+1);
        adancime[it]=niv;
    }
}
void init() {
    int log= log2(n) + 1;
    for(int i = 1; i <= log; i++) {
        for(int j = 1; j <= n; j++) {
            stramos[i][j] = stramos[i - 1][stramos[i - 1][j]];
        }
    }
}
void niv(int &a, int &b) {
    if(adancime[a] < adancime[b]) {
        swap(a, b);
    }
    int dist = adancime[a] - adancime[b];
    for(int j = 0; j <= log2(n) + 1; j++) {
        if(dist & (1 << j)) {
            a = stramos[j][a];
        }
    }
}
int lca(int a, int b) {
    if(a == b) {
        return a;
    }
    for(int j=log2(n)+1;j >= 0;j--) {
        if(stramos[j][a] != stramos[j][b]&&stramos[j][a]) {
            a = stramos[j][a];
            b = stramos[j][b];
        }
    }

    return stramos[0][a];
}
int main()
{
    r>>n>>m;
    stramos[0][1]=1;
    for(int i=2;i<=n;i++){
        r>>stramos[0][i];
        g[stramos[0][i]].push_back(i);
    }
    dfs(1, 0);
    init();
    while(m--){
        int a, b;
        r>>a>>b;
        niv(a, b);
        w<<lca(a, b)<<"\n";
    }
    return 0;
}