Cod sursa(job #2240399)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 13 septembrie 2018 10:59:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>
using namespace std ;
ifstream f ( "rmq.in" ) ;
ofstream g ( "rmq.out") ;

const int N = 17 ;
const int M = 100005 ;

int main ()
{
 int n , m , s [ M ] , i , j , a [ M ][ N ] , l [ M ] ;
  f >> n >> m ;
  for ( i = 0 ; i < n ; i ++ ) f >> s [ i ] ;
  for ( i = 0 ; i < n ; i ++ ) a[ i ][ 0 ] = i ;
  for ( j = 1 ; ( 1 << j ) <= n ; j ++ )
  for ( i = 0 ; i + ( 1 << j ) - 1 < n ; i ++ )
    if (  s[ a[ i ][ j - 1 ] ] < s [ a[ i + ( 1 << ( j - 1 ) ) ][ j - 1 ] ]  )
        a[ i ][ j ] = a[ i ][ j - 1 ] ;
    else
        a[ i ][ j ] =  a[ i + ( 1 << ( j - 1 ) ) ][ j - 1 ] ;

for ( i = 2 ; i <= n ; i *= 2 )  l [ i ] = 1 ;
for ( i = 3 ; i <= n ; i ++ ) l [ i ] += l [ i - 1 ] ;

while ( m -- )
{
    int st , dr , p ;
    f >> st >> dr ;
    st -- ; dr -- ;
    i = dr - st + 1 ;
    i = l [ i ] ;
    p = 1 << i ;
    g << min ( s [ a [ st ][ i ] ] , s [ a [ dr - p + 1 ][ i ] ] ) << "\n" ;
}

return 0 ;}