Cod sursa(job #2759555)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 18 iunie 2021 23:18:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>

#define NMAX 100000 //o suta de mii
#define LOGMAX 16

using namespace std;

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

int N, M;
int v[NMAX + 1][LOGMAX + 1];

inline void build(){
    for(int i = N; i >= 1; i--){
        for(int j = 1; i + (1 << j) - 1 <= N; j++){
            v[i][j] = min(v[i][j - 1], v[i + (1 << (j - 1)) ][j - 1]);
        }
    }
}

int putereDoiLowerbound(int x){
    int lo = -1;
    int hi = LOGMAX + 1;

    while(hi - lo > 1){
        int mid = lo + (hi - lo) / 2;

        if( (1 << mid) <= x ){
            lo = mid;
        }
        else {
            hi = mid;
        }
    }

    return lo;
}

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

    for(int i = 1; i <= N; i++){
        fin >> v[i][0];
    }

    build();

    for(int q = 1; q <= M; q++){
        int a, b;
        fin >> a >> b;

        int k = putereDoiLowerbound(b - a + 1);
        fout << min(v[a][k], v[b - (1 << k) + 1][k]) << "\n";
    }

    return 0;
}