Cod sursa(job #2409652)

Utilizator robx12lnLinca Robert robx12ln Data 19 aprilie 2019 12:32:10
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include<bits/stdc++.h>
using namespace std;

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

const int DIM = 1e5 + 5;

int N, Niv[DIM], Rmq[20][DIM], M, Log;
vector<int> edge[DIM];

void dfs( int nod, int nv ){
    Niv[nod] = nv;
    for( int i = 0; i < edge[nod].size(); i++ )
        dfs( edge[nod][i], nv + 1 );
}

inline int lca( int x, int y ){
    if( Niv[x] > Niv[y] )
        swap( x, y );
    for( int k = Log; k >= 0; k-- )
        if( Niv[ Rmq[k][y] ] >= Niv[x] )
            y = Rmq[k][y];
    if( x == y )
        return x;
    for( int k = Log; k >= 0; k-- ){
        if( Rmq[k][x] != Rmq[k][y] ){
            x = Rmq[k][x];
            y = Rmq[k][y];
        }
    }
    if( x == y )
        return x;
    return Rmq[0][x];
}

int main(){
    fin >> N >> M;
    for( int i = 2; i <= N; i++ ){
        fin >> Rmq[0][i];
        edge[ Rmq[0][i] ].push_back( i );
    }

    Log = 0;
    while( (1<<Log) <= N )
        Log++;
    dfs( 1, 1 );
    for( int k = 1; k <= Log; k++ )
        for( int i = 1; i <= N; i++ )
            Rmq[k][i] = Rmq[k - 1][ Rmq[k - 1][i] ];

    for( int i = 1; i <= M; i++ ){
        int x, y; fin >> x >> y;
        fout << lca( x, y ) << "\n";
    }
    return 0;
}