Cod sursa(job #2741028)

Utilizator SerbaP123Popescu Serban SerbaP123 Data 15 aprilie 2021 11:42:17
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <cmath>
using namespace std;

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

const int nmax = 1e5;
const int Lmax = 20;

int m[nmax + 1][Lmax], a[nmax + 1], lg[nmax + 1];
int n, q, x, y;

void citire(){
    cin >> n >> q;
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
    }
}

void RMQ(){
    for(int i = 1; i <= n; ++i){
        m[0][i] = a[i];
    }
    for(int i = 1; (1 << i) <= n; ++i){
        for(int j = 1; j <= n - (1 << i) + 1; ++j){
            int lungime = (1 << i - 1);
            m[i][j] = min(m[i - 1][j], m[i - 1][j + lungime]);
        }
    }
}

void Creare(){
    lg[1] = 0;
    for(int i = 2; i <= n; ++i){
        lg[i] = lg[i / 2] + 1;
    }
}

void solve(){
    for(int i = 1; i <= q; ++i){
        cin >> x >> y;
        int distanta = y - x + 1;
        int l = lg[distanta];
        int ans = distanta - (1 << l);
        cout << min(m[l][x], m[l][x + ans]) << "\n";
    }
}

int main(){
    citire();
    Creare();
    RMQ();
    solve();
    return 0;
}