Cod sursa(job #2795770)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 6 noiembrie 2021 22:39:59
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#pragma GCC optimize("O3")
#include <stdio.h>

#define min( x, y ) y ^ ( ( x ^ y ) & -( x < y ) )
   
#include <ctype.h>
 
inline int readINT( FILE *fin ) {
    int ch;
    int rez = 0;
    while( !isdigit( ( ch = fgetc( fin ) ) ) );
 
    do
        rez = rez * 10 + ch - '0';
    while( isdigit( ( ch = fgetc( fin ) ) ) );
 
    return rez;
}

int rmq[ 17 ][ 100001 ];
int poz[ 100001 ];
int n, q;

int main()
{
    FILE *fin = fopen( "rmq.in", "r" );
    n = readINT( fin );
    q = readINT( fin );
    for( int i = 1; i <= n; i++ )
        rmq[ 0 ][ i ] = readINT( fin );

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

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

    int a, b;
    FILE *fout = fopen( "rmq.out", "w" );
    while( q-- ) {
        fscanf( fin, "%d %d", &a, &b );
        fprintf( fout, "%d\n", min( rmq[ poz[ b - a + 1 ] ][ a ], rmq[ poz[ b - a + 1 ] ][ b - ( 1 << poz[ b - a + 1 ] ) + 1 ] ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}