Cod sursa(job #2734921)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 1 aprilie 2021 17:11:50
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
const int NMAX = 1e5;
const int LOGMAX = 16;
int rmq[NMAX + 1][LOGMAX + 1];
FILE *fin;
ofstream fout ( "rmq.out" );
static inline int min ( int a, int b ) {
    return a < b? a: b;
}
int get () {
    int nr = 0, ch;
    while ( !isdigit ( ch = fgetc ( fin ) ) );
    do {
        nr = nr * 10 + ch - '0';
    } while ( isdigit ( ch = fgetc ( fin ) ) );
    return nr;
}
int main () {
    int n, t, len, a, b;
    
    fin = fopen ( "rmq.in", "r" );
    n = get (); t = get ();
    for ( int i = 1; i <= n; i++ )
        rmq[i][0] = get ();
    
    for ( int len = 1; ( 1 << len ) <= n; len++ )
        for ( int i = 1; i <= n - ( 1 << len ) + 1; i++ )
            rmq[i][len] = min ( rmq[i][len - 1],
                               rmq[i + ( 1 << ( len - 1 ) ) ][len - 1] );
    
    while ( t-- ) {
        a = get (); b = get ();
        len = log2 ( b - a + 1 );
        fout << min ( rmq[a][len], rmq[b - ( 1 << len ) + 1][len]) << '\n';
    }
    
    fclose ( fin );
                                   
    
    return 0;
}