Cod sursa(job #2092046)

Utilizator VladGhetinaVlad Ghetina VladGhetina Data 20 decembrie 2017 21:03:11
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <vector>

using namespace std;

#define IN "lca.in"
#define OUT "lca.out"
#define l 100003
#define pb push_back

int n , m , lg;
vector<int>G[l];
int E[l<<2] , F[l<<2] , loga[l<<2];
int rmq[18][l<<2];

void Read()
{
    int i , x;

    scanf ( "%d%d" , &n , &m );

    for ( i = 2 ; i <= n ; i ++ )
        scanf ( "%d" , &x ) , G[x].pb(i);
}

void Euler_Tour(int nod) {
    int i;

    E[++lg] = nod;
    F[nod] = lg;

    for ( i = 0 ; i < G[nod].size() ; i ++ ) {
        Euler_Tour(G[nod][i]);
        E[++lg]=nod;
    }
}

void RMQ()
{
    int i , j , t;

    for ( i = 1 ; i <= lg ; i ++ ){
        rmq[0][i] = level[i];
        if ( i > 1)
          loga[i] = loga[i/2]+1;
    }

    t = loga[lg];
    for ( i = 1 ; i <= t ; i ++ )
        for ( j = 1 ; j+(1<<(i-1)) < lg ; j ++ )
            rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);

}

void Solve()
{
    int i , x , y , a , b , d;

    for ( i = 1 ; i <= m ; i ++ ){
            scanf ( "%d%d" , &a , &b );

      x = min(F[a],F[b]) , y = max(F[a],F[b]);
      d = loga[y-x+1];

      printf ( "%d\n" , min(rmq[d][x],rmq[d][y-(1<<d)+1]));

    }
}

int main()
{
    freopen(IN , "r" , stdin);
    freopen(OUT , "w" , stdout);

    Read();
    Euler_Tour(1);
    RMQ();
    Solve();
}