Cod sursa(job #2236189)

Utilizator rnqftwcalina florin daniel rnqftw Data 28 august 2018 16:08:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<bits/stdc++.h>

using namespace std;

#define MAX 100005

int niv[MAX * 2] , rmq[MAX * 2][18] , first[MAX * 2] , euler[2 * MAX] ,aux[MAX * 2];

vector<int> graf[MAX];

int k  , n ;

void dfs_euler(int nod){
    euler[k++] = nod ;
    first[nod] = k-1 ;
    for(auto it : graf[nod]){
        niv[it] = niv[nod] + 1 ;
        dfs_euler(it);
        euler[k++] = nod ;
    }
}

void RMQ(){
    for(int  i = 0 ; i < k ; i ++)
        aux[i] = niv[euler[i]];
    for(int  i = 0 ; i < k ; i ++)
        rmq[i][0] = i;

    for(int j = 1 ; (1 << j) <= k ; j ++){
            int i;
        for(i = 0 ; i + (1 << j ) - 1 < k ; i ++)
            if(aux[rmq[i][j-1]] < aux[rmq[i + (1 << j - 1)][j-1]])
                rmq[i][j] = rmq[i][j-1];
            else
                rmq[i][j] = rmq[i + (1 << j - 1)][j-1];
       // cout << i << " ";
    }



}


int query(int left , int right){

    int a= first[left];
    int b = first[right];
    if(a>b) swap(a,b);
    int l = (b-a) + 1 ;
    l = (int)log2(l) ;

    if(aux[rmq[a][l]] < aux[rmq[b - (1 << l) + 1][l]])
        return euler[rmq[a][l]];
    else
        return  euler[rmq[b - (1 << l) + 1][l]];
}

int main(){
    int q ;
    ifstream in("lca.in");
    ofstream out("lca.out");
    in >> n >> q ;
    for(int i = 1 ; i < n ; i ++){
        int x ;
        in >> x;
        graf[x].push_back(i+1);
    }
    dfs_euler(1);
    RMQ();
    int x , y ;

    while(q--){
        in >> x >> y ;
        out << query(x,y) << '\n';
    }

}