Cod sursa(job #2412396)

Utilizator robx12lnLinca Robert robx12ln Data 22 aprilie 2019 10:58:21
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include<bits/stdc++.h>
using namespace std;

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

const int DIM = 1e5 + 5;

int N, M, E[2 * DIM], F[2 * DIM], Rmq[20][2 * DIM], Niv[2 * DIM], K, P[2 * DIM];
vector<int> edge[DIM];

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

int main(){

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

    dfs( 1, 1 );
    for( int i = 1; i <= K; i++ )
        Rmq[0][i] = i;

    for( int i = 1; (1<<i) <= K; i++ ){
        for( int j = 1; j <= K; j++ ){
            Rmq[i][j] = Rmq[i - 1][j];
            if( j + (1<<i) <= K && Niv[ E[ Rmq[i][j] ] ] > Niv[ E[ Rmq[i - 1][j + (1<<(i - 1))] ] ] )
                Rmq[i][j] = Rmq[i - 1][j + (1<<(i - 1))];
        }
    }

    /*
    for( int i = 0; (1<<i) <= K; i++, fout << "\n" )
    for( int j = 1; j <= K; j++, fout << " " ){
        if( Rmq[i][j] < 10 )
            fout << " ";
        fout << Rmq[i][j];
    }*/

    P[1] = 0;
    for( int i = 2; i <= K; i++ )
        P[i] = P[i / 2] + 1;

    for( int t = 1; t <= M; t++ ){
        int x, y; fin >> x >> y;
        if( F[x] > F[y] )
            swap( x, y );

        x = F[x];
        y = F[y];
        int put = P[y - x + 1];

        if( Niv[ E[ Rmq[put][x] ] ] < Niv[ E[ Rmq[put][y - (1<<put) + 1] ] ] )
            fout << E[ Rmq[put][x] ] << "\n";
        else
            fout << E[ Rmq[put][y - (1<<put) + 1] ] << "\n";
    }

    return 0;
}