Cod sursa(job #2741022)

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

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

const int nmax = 1e5 + 1;
const int logNmax = log(1e5);

int rmq[nmax][logNmax], a[nmax], n, lungime, m, x, y;
int lg[nmax];

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

int main(){
    cin >> n >> m;
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
    }
    RMQ(rmq, a);
    lg[1] = 0;
    for(int i = 2; i <= n; ++i){
        lg[i] = lg[i / 2] + 1;
    }
    for(int i = 1; i <= m; ++i){
        cin >> x >> y;
        int distanta = y - x + 1;
        int l = lg[distanta];
        int ans = distanta - (1 << l);
        cout << min(rmq[l][x], rmq[l][x + ans]) << "\n";
    }
    return 0;
}