Cod sursa(job #1346000)

Utilizator superman_01Avramescu Cristian superman_01 Data 17 februarie 2015 23:01:27
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <iostream>
#include <cstring>

#define NMAX 100005
#define get_max(a,b) ((a)>(b)?(a):(b))
#define get_min(a,b) ((a)<(b)?(a):(b))

using namespace std;

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

int RMQ[18][NMAX];
int N , M , lg[NMAX];

int main ( void ){
   int i , j , left , right;
   in >> N >> M ;
   for ( i = 1 ; i <= N ; ++i )
        in >> RMQ[0][i];
   for ( i = 1 ; i <= N ; ++i )
       lg[i] = lg[i/2]+1;
   for ( i = 1 ; ( 1 << i ) <= N ; ++i )
     for ( j =  1 ; j <= N - (1<<i) + 1 ; ++j )
         RMQ[i][j] = get_min(RMQ[i-1][j] , RMQ[i-1][j+(1<<(i-1))]);

   for ( i = 1 ; i <= M ; ++i ){
         in >> left >> right ;
         int diff = left - right +1  ;
         int Power = lg[diff];
         out << get_min( RMQ[Power][right] , RMQ[Power][left-(1<<Power)+1]) << "\n";
   }
   return 0 ;
}