Cod sursa(job #2817117)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 12 decembrie 2021 21:27:04
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
    
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
    
static inline int min( int a, int b ) {
    return ( a <= b ? a : b );
}
 
static inline int max( int a, int b ) {
    return ( a >= b ? a : b );
}
 
static inline int mod( int x ) {
    return x < 0 ? -x : x;
}
    
FILE *fin;
 
int poz, valBuff;
static char buff[ ( 1 << 7 ) ];
static inline char nextChar() {
    if( poz == valBuff ) {
        fread( buff, 1, valBuff, fin );
        poz = 0;
    }
 
    return buff[ poz++ ];
}
 
static bool f[ 100 ];
static inline int readInt() {
    int rez = 0;
    int ch;
 
    while( !f[ ch = nextChar() ] );
    do
        rez = rez * 10 + ch - '0';
    while( f[ ch = nextChar() ] );
 
    return rez;
}
 
/////////////////////////////////////////////////////////////////////////////////////////////
#define MAX 100000

int rmq[ 17 ][ MAX + 1 ];
int my_log[ MAX + 1 ];
int n;

int main()
{ 
    f[ '0' ] = f[ '1' ] = f[ '2' ] = f[ '3' ] = f[ '4' ] = 1;
    f[ '5' ] = f[ '6' ] = f[ '7' ] = f[ '8' ] = f[ '9' ] = 1;
    valBuff = sizeof( buff );

    fin = fopen( "rmq.in", "r" );
    fread( buff, 1, valBuff, fin );

    n = readInt();
    int q = readInt();

    my_log[ 1 ] = 0;
    for( int i = 2; i <= n; i++ )
        my_log[ i ] = my_log[ i >> 1 ] + 1;

    for( int i = 1; i <= n; i++ )
        rmq[ 0 ][ i ] = readInt();


    register int delta;
    for( int i = 1; ( 1 << i ) <= n; i++ ) {
        delta = 1 << ( i - 1 );
        for( int j = 1; j + delta <= n; j++ )
            rmq[ i ][ j ] = min( rmq[ i - 1 ][ j ], rmq[ i - 1 ][ j + delta ] );
    }

    register int a, b;
    FILE *fout = fopen( "rmq.out", "w" );
    while( q-- ) {
        a = readInt();
        b = readInt();
        int x = b - a + 1;
        int Log2 = my_log[ x ];
        fprintf( fout, "%d\n", min( rmq[ Log2 ][ a ], rmq[ Log2 ][ b - ( 1 << Log2 ) + 1 ] ) );
    }
    return 0;
}