Cod sursa(job #2134229)

Utilizator eduardandrei20Nechifor Eduard Andrei eduardandrei20 Data 17 februarie 2018 19:18:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <bits/stdc++.h>
#define dim 100005*2
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");

   int n , query , rmq[25][dim], nivel[dim], pozitie[dim] ,m;
     vector < int > G[dim];
      int LOG[dim];

   void Input ()
    {   //citirea
          in >> n >> query;
              for ( int i = 2 ; i <= n ; ++i )
              { int x;
                   in >>x ;
                      G[x].push_back(i);
              }
    }

     void DFS( int nod , int niv)
     {
            rmq [0] [ ++m ] = nod ;
               nivel [ nod ] = niv ;
                   pozitie [ nod ] = m;
                      for ( size_t j = 0 ; j < G[nod] . size() ; ++j)
                                {
                                    DFS( G[nod][j] , niv+1 ) ;
                                           rmq [0] [ ++m ] = nod ;
               nivel [ nod ] = niv ;
                                }
     }

void RMQ()
{
    LOG[ 1 ] = 0 ;
         for ( int i = 2 ; i <= m ; ++i )
                    LOG [i] = LOG[i/2]+1;

         for ( int i =1 ; i <= LOG[m] ;++ i )
                  for ( int j = 1 ; j <= m-( 1 << (  i-1 )  ) ;++ j  )
                  {
                      if(  nivel[rmq [i-1][j]] < nivel [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 )  ) ];
      //dinamica
                  }
}

void LCA ( int x , int y )
 {
     int a = pozitie[ x ] ;
      int b = pozitie [ y ];
       if ( b<a)swap (a,b);
         int k = LOG[b-a+1];
            if (    nivel[rmq[k][a]]>nivel[rmq[k][b-(1<<k)+1]]  )
                  out << rmq [k][b-(1<<k)+1]<<"\n";
            else  out << rmq[k][a]<<"\n";
 }




int main()
{
Input();
DFS(1,0);
RMQ();
for ( int i =1 ; i <= query ; ++i)
{
    int x,y;
    in>>x>>y;
    LCA(x,y);
}

    return 0;
}