Cod sursa(job #2565429)

Utilizator robx12lnLinca Robert robx12ln Data 2 martie 2020 14:13:26
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include<bits/stdc++.h>
using namespace std;

FILE * fin = fopen("lca.in","r");
FILE * fout = fopen("lca.out","w");

const int DIM = 1e5 + 5;

int N, M, niv[DIM], euler[2 * DIM], pos[DIM], rmq[19][2 * DIM], K, P[2 * DIM];
vector<int> edge[DIM];

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

void dfs1( int nod ){
    euler[++K] = nod;
    if( pos[nod] == 0 )
        pos[nod] = K;
    for( int i = 0; i < edge[nod].size(); i++ ){
        dfs1( edge[nod][i] );
        euler[++K] = nod;
    }
    return;
}

int main(){
    fscanf( fin, "%d%d", &N, &M );
    for( int i = 2; i <= N; i++ ){
        int x; fscanf( fin, "%d", &x );
        edge[x].push_back( i );
    }
    dfs( 1 );
    dfs1( 1 );

    for( int i = 1; i <= K; i++ )
        rmq[0][i] = euler[i];

    for( int i = 1; (1<<i) <= K; i++ ){
        for( int j = 1; j + (1<<(i-1)) <= K; j++ ){
            if( niv[ rmq[i - 1][j] ] < niv[ rmq[i - 1][j + (1<<(i-1))] ] )
                rmq[i][j] = rmq[i - 1][j];
            else
                rmq[i][j] = rmq[i - 1][j + (1<<(i-1))];
        }
    }

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

    for( int i = 1; i <= M; i++ ){
        int a, b; fscanf( fin, "%d%d", &a, &b );
        if( pos[a] > pos[b] )
            swap( a, b );
        a = pos[a];
        b = pos[b];
        int put = P[b - a + 1];
        if( niv[ rmq[put][a] ] < niv[ rmq[put][b - (1<<put) + 1] ] )
            fprintf( fout, "%d\n", rmq[put][a] );
        else
            fprintf( fout, "%d\n", rmq[put][b - (1<<put) + 1] );
    }

    return 0;
}