Cod sursa(job #2570499)

Utilizator maria15Maria Dinca maria15 Data 4 martie 2020 17:13:31
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n, m, i, j, exp, lung, d[30][100003], prima_ap[100002], t[100002], a, b, nr, niv[100002];
short log[100002];
vector<int> v[100002];

void dfs(int nod, int nivel){
    d[0][++nr] = nod;
    prima_ap[nod] = nr;
    niv[nod] = nivel;
    for(int i = 0;i<v[nod].size();i++){
        int vecin = v[nod][i];
        dfs(vecin, nivel+1);
        d[0][++nr] = nod;
    }
}

int main(){
    fin>>n>>m;
    for(i=2;i<=n;i++){
        fin>>t[i];
        v[t[i]].push_back(i);
    }
    dfs(1, 1);

    log[1] = 0;
    for(i=2;i<=nr+2;i++){
        log[i] = log[i-1];
        if(i == (1<<(log[i]+1)))
            log[i]++;
    }

    for(i=1;i<=log[nr]+1;i++){
        lung = (1<<i);
        for(j=1;j<=nr;j++){
            d[i][j] = d[i-1][j];
            if(j+lung/2 <= nr)
                d[i][j] = min(d[i][j], d[i-1][j+lung/2]);
        }
    }

    while(m--){
        fin>>a>>b;
        int p1 = prima_ap[a];
        int p2 = prima_ap[b];
        lung = p2-p1+1;
        exp = log[lung];
        fout<<min(d[exp][p1], d[exp][p2-(1<<exp)+1])<<"\n";
    }
    return 0;
}