Cod sursa(job #1654107)

Utilizator DysKodeTurturica Razvan DysKode Data 16 martie 2016 20:22:55
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <list>

using namespace std;

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

list<int>G[100010];

int rmq[19][200010],i,j,n,l[200010],x,v[200010],lg[200010],m,y,k,p[100010];

void dfs( int nod, int lev )
{
    l[ nod ] = lev;
    v[ ++v[ 0 ] ] = nod;
    p[ nod ] = v[ 0 ];
    for( auto it : G[ nod ] )
    {
        dfs( it , lev + 1 );
        v[ ++v[ 0 ] ] = nod;
    }
}

int main()
{
    fin>>n>>m;
    for( i = 2 ; i <= n ; i++ )
    {
        fin>>x;
        G[ x ].push_back( i );
    }

    dfs( 1 , 0 );

    n = v[ 0 ];

    for( i = 2 ; i <= n ; i++ )
        lg[ i ] = lg[ i / 2 ] + 1;
    for( i = 1 ; i <= n ; i++ )
        rmq[ 0 ][ i ] = v[ i ];
    for( i = 1 ; i <= lg[ n ] ; i++ )
    for( j = 1 ; j <= n ; j++ )
        if( l[ rmq[ i - 1 ][ j ] ] < l[ 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 ) ) ];

    for( i = 1 ; i <= m ; i++ )
    {
        fin>>x>>y;
        x = p[ x ];
        y = p[ y ];
        k = lg[ y - x ];
        if( l[ rmq[ k ][ x ] ] < l[ rmq[ k ][ y - ( 1 << k ) + 1 ] ] )
            fout<<rmq[ k ][ x ]<<'\n';
        else
            fout<<rmq[ k ][ y - ( 1 << k ) + 1 ]<<'\n';
    }

return 0;
}