Cod sursa(job #1464101)

Utilizator petru.cehanCehan Petru petru.cehan Data 22 iulie 2015 12:37:08
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb

#include <iostream>
#include <fstream>

using namespace std;

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

int N , M ;
int vec [100001] , RMQ [20][100001] ;

void Citire ()
{
    fin >> N >> M ;
    for ( int i = 0 ; i < N ; ++ i )
           fin >> vec [i] ;
}

void RMQCONSTRUCT ()
{
    for ( int i = 0 ; i < N ; ++ i )
          RMQ [0][i] = vec [i] ;

    for ( int i = 1 ; ( 1 << i ) < N ; ++ i )
      for ( int j = 0 ; ( j + ( 1 << ( i - 1 ) ) ) < N ; ++ j )
                 RMQ [i][j] = min ( RMQ [i-1][j] , RMQ [i-1] [ j + ( 1 << ( i - 1 ) ) ] ) ;

}

int Query ( int a , int b )
{
 int minim ;
 int k = 0 ;
 while ( ( 1 << k ) <= b - a + 1 )
              ++ k ;
 -- k ;

 return ( minim = min ( RMQ [k][a] , RMQ [k][ b - ( 1 << k ) + 1 ] ) ) ;

}

int main()
{
    Citire () ;
    RMQCONSTRUCT() ;
    int x , y ;

    for ( ; M ; -- M )
          fin >> x >> y , fout << Query ( x - 1 , y - 1 ) << "\n" ;

    return 0;
}