Cod sursa(job #2817987)

Utilizator teodorescunicolasteodorescu nicolas alexandru teodorescunicolas Data 14 decembrie 2021 21:51:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>

#define NMAXX 100000
#define LOGMAXX 16

using namespace std;

int v[NMAXX], table[NMAXX][LOGMAXX + 1];

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

void build( int n ) {
    int i, j;

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

    for ( j = 1; j <= LOGMAXX; j++ ) {
        for ( i = 0; i + (1 << j) - 1 < n; i++ ) {
            table[i][j] = min( table[i][j - 1], table[i + (1 << (j - 1))][j - 1] );
        }
    }
}

int query( int left, int right ) {
    int dist, log;

    dist = right - left + 1;
    log = 0;
    while ( dist > 1 ) {
        dist /= 2;
        log++;
    }

    return min( table[left][log], table[right - (1 << log) + 1][log] );
}

int main()
{
    FILE *fin, *fout;
    int n, i, q, left, right;

    fin = fopen( "rmq.in", "r" );
    fout = fopen( "rmq.out", "w" );

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

    build( n );

    for ( i = 0; i < q; i++ ) {
        fscanf( fin, "%d%d", &left, &right );
        fprintf( fout, "%d\n", query( left - 1, right - 1 ));
    }

    fclose( fin );
    fclose( fout );
    return 0;
}