Cod sursa(job #2323132)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 18 ianuarie 2019 21:08:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
#define pb push_back
#define sz size()
using namespace std ;
const int NR = 100001 ;
ifstream f ("rmq.in") ;
ofstream g ("rmq.out") ;
int level [ NR ] , last ;
const int NMAX = 100001 ;
const int LOGNMAX  = 20;
int rmq [ LOGNMAX ][ NMAX ]  ;
  int lg [ NMAX ]  ;
  int v[ NMAX ]  , n ;

     void rmq_sol3 (  )
    {
        int i ,j ;
        for ( i = 1 ; i <= n ; ++ i )    rmq [ 0 ][ i ] = v [ i ] ;

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

        for ( i = 2 ; i <= n ; ++ i )   lg [ i ] = lg [ i >> 1 ] + 1 ;

    }

    int query_sol3 (  int a , int b )
    {
        if ( a > b )    swap ( a , b ) ;
        int log = lg [ b - a + 1 ] ;
        return  min ( rmq [ log ][ a ] , rmq [ log ][ b - ( 1 << log ) + 1 ] ) ;
    }
int main ()
{
    int  q ; f >> n >> q ;

    for ( int i = 1 ; i <=  n ; ++ i )   f >> v[ i ];
    rmq_sol3 (   ) ;
    while ( q -- )
    {
        int a , b ; f >> a >> b ;
        g << query_sol3 (  a , b  ) << "\n" ;

    }
}