Cod sursa(job #1043057)

Utilizator Teodor94Teodor Plop Teodor94 Data 27 noiembrie 2013 22:36:29
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX_N 100000
#define MAX_LOG 17

int rmq[MAX_LOG][MAX_N];
int log2[MAX_N];

void read( FILE *fin, int &n, int &m ) {
    fscanf( fin, "%d%d", &n, &m );
    for ( int i = 0; i < n; ++i )
        fscanf( fin, "%d", &rmq[0][i] );
}

void gen_rmq( int n ) {
    for ( int len = 1; ( 1 << len ) < n; ++len )
        for ( int i = 0; i < n; ++i ) {
            rmq[len][i] = rmq[len - 1][i];

            int mid = 1 << ( len - 1 );
            if ( i + mid < n )
                rmq[len][i] = min( rmq[len][i], rmq[len - 1][i + mid] );
        }
}

void pregen_log2( int n ) {
    log2[1] = 0;
    for ( int i = 2; i < n; ++i )
        log2[i] = log2[i >> 1] + 1;
}

int main() {
    FILE *fin, *fout;

    fin = fopen( "rmq.in", "r" );
    int n, m;
    read( fin, n, m );

    gen_rmq( n );
    pregen_log2( n );

    fout = fopen( "rmq.out", "w" );
    while ( m ) {
        int left, right;
        fscanf( fin, "%d%d", &left, &right );

        int len = log2[right - left + 1];

        fprintf( fout, "%d\n", min( rmq[len][left], rmq[len][right - ( 1 << len )] ) );

        --m;
    }

    fclose( fin );
    fclose( fout );
}