Cod sursa(job #1244581)

Utilizator felixiPuscasu Felix felixi Data 17 octombrie 2014 20:23:13
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <algorithm>
#include <fstream>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

const int NMAX = 100000;
const int JMAX = 20;

int N,M;
int v[NMAX+1], d[NMAX+1][JMAX-2];

void citire() {
    in >> N >> M;
    for( int i= 1;  i<=N;  ++i ) {
        in >> v[i];
    }
}

void DINAMICA() {
    int Jmax= 0;
    while( (1<<Jmax) <= N )  ++Jmax;
    --Jmax;

    for( int j= 0;  j<=Jmax;  ++j ) {
        for( int i= 1;  i<=N-(1<<j)+1;  ++i ) {
            if( j==0 ) {
                d[ i ][ j ]= v[ i ];
            }
            else {
                d[ i ][ j ]= min( d[ i ][ j-1 ], d[ i + ( 1<<(j-1) ) ][ j-1 ] );
            }
        }
    }
}

int  QUERRY( int x, int y ) {
    int lg= y-x+1;
    int dt= 0;  ///  DT = Puterea maxima a lui 2 mai mica sau egala cu LG

    while( (1<<dt) <= lg )  ++dt;
    --dt;

    return ( min( d[ x ][ dt ], d[ y - (1<<dt) + 1 ][ dt ] ) );
}



int main() {
    citire();
    DINAMICA();
    for( int i= 1;  i<=M; ++i ) {
        int x,y;
        in >> x >> y;
        out << QUERRY( x,y ) << '\n';
    }
    return 0;
}