Cod sursa(job #2485698)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 1 noiembrie 2019 21:49:42
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

const int MAXN = 100000 + 5;
const int MAXLOG = log2(MAXN);

using namespace std;

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

int n,intrebari;
vector<int>arbore[MAXN];
int dp[MAXN][MAXLOG + 5],inaltime[MAXN];


int main()
{
    in>>n>>intrebari;
    inaltime[1] = 1;
    for(int i = 2; i <= n; i++){
        int nod;
        in>>nod;
        inaltime[i] = inaltime[nod] + 1;
        dp[i][0] = nod;
    }
    for(int put = 1; put < MAXLOG; put++){
        for(int i = 2; i <= n; i++){
            int stramos = dp[i][put - 1];
            if(stramos)
                dp[i][put] = dp[stramos][put - 1];
        }
    }
    /*for(int i = 1; i <= n; i++){
        for(int j = 0; j < MAXLOG; j++){
            if(dp[i][j])
                cout<<"Al "<<(1<<j)<<" lea stramos al lui "<<i<<" este :"<<dp[i][j]<<endl;
        }
    }*/
    for(int i = 1; i <= intrebari; i++){
        int nod1,nod2;
        in>>nod1>>nod2;
        int put = MAXLOG,stramos;
        if(inaltime[nod1] < inaltime[nod2])
            swap(nod1,nod2);
        while(inaltime[nod1] != inaltime[nod2])
            nod1 = dp[nod1][0];
        //cout<<nod1<<" "<<nod2<<endl;
        while(put >= 0){
            //cout<<dp[nod1][put]<<" "<<dp[nod2][put]<<":"<<put<<endl;
            if(dp[nod1][put] && dp[nod1][put] != dp[nod2][put]){
                nod1 = dp[nod1][put];
                nod2 = dp[nod2][put];
            }
            if(put == 0)
                break;
            put /= 2;
        }
        if(nod1 != nod2)
            out<<dp[nod1][0];
        else
            out<<nod1;
        out<<"\n";
        //cout<<stramos<<"\n";
    }

    return 0;
}