Cod sursa(job #2136359)

Utilizator TudorVersoiuVersoiu Tudor Sorin TudorVersoiu Data 19 februarie 2018 20:58:51
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <iostream>
#include <fstream>
#include <cmath>

#define POW2(X) (1<<(X))

using namespace std;
ifstream f("rmq.in" );
ofstream g("rmq.out");


int M, N;
int v[100005], rmq[100005][32];


void Preprocess() {
    for ( int i=1; i<=N; i++ )
        rmq[i][0] = v[i];

    for ( int p=1; POW2(p)<=N; p++ )
        for ( int i=1; i+POW2(p)-1<=N; i++ )
            rmq[i][p] = min(rmq[i][p-1], rmq[i+POW2(p-1)][p-1]);
}


int Query(int x, int y) {
    int power = (int)log2(y-x+1);

    return min(rmq[x][power], rmq[y-POW2(power)+1][power]);
}


int main() {
    f >> N >> M;

    for ( int i=1; i<=N; i++ )
        f >> v[i];

    Preprocess();

    for ( int i=1; i<=M; i++ )
    {
        int a, b;
        f >> a >> b;

        g << Query(a, b) << '\n';
    }
}