Cod sursa(job #1193337)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 31 mai 2014 14:40:14
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#define MAXN 100000
#define LG 19

int RMQ[MAXN][LG];
int v[MAXN];
int log[MAXN];

inline int min( int a, int b ) {
    return a < b ? a : b;
}

int main () {
    FILE *f, *g;
    f = fopen( "rmq.in", "r" );
    g = fopen( "rmq.out", "w" );

    int n, m;

    fscanf( f, "%d%d", &n, &m );

    for( int i = 0 ; i < n ; ++i )
        fscanf( f, "%d", &v[i] );

    log[1] = 0;

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

    for( int i = 0 ; i < n ; ++i )
        RMQ[i][0] = v[i];

    for( int l = 1 ; (1 << l) <= n ; ++l )
        for( int i = 0 ; i + ( 1<<l ) - 1 < n ; ++i ) {
            int len = ( 1<<(l-1) );
            RMQ[i][l] = min( RMQ[i][l-1], RMQ[i+len][l-1] );
        }

    int x, y;

    for( int i = 0 ; i < m ; ++i ) {
        fscanf( f, "%d%d", &x, &y );
        --x;
        --y;

        int diff = y - x + 1;
        int lg = log[diff];
        int rest = diff - ( 1 << lg );
        fprintf( g, "%d\n", min( RMQ[x][lg], RMQ[x+rest][lg] ) );
        }

    fclose( f );
    fclose( g );

    return 0;
}