Cod sursa(job #2142095)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 24 februarie 2018 18:48:57
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;
const int LG = 17;

int rmq[LG][N];
int lg2[N];

int query(int l, int r){
    int bucket = lg2[r - l + 1];
    return min(rmq[bucket][l], rmq[bucket][r - (1 << bucket) + 1]);
}

int main(){
    freopen("home.in", "r", stdin);
    freopen("home.out", "w", stdout);
    int n, q;
    scanf("%d %d", &n, &q);
    for(int i = 1;i <= n;i++){
        scanf("%d", &rmq[0][i]);
    }
    for(int i = 2;i <= n;i++){
        lg2[i] = lg2[i / 2] + 1;
    }
    for(int i = 1;i <= LG;i++){
        for(int j = 1;j + (1 << i) - 1 <= n;j++){
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
        }
    }
    while(q--){
        int l, r;
        scanf("%d %d", &l, &r);
        printf("%d\n", query(l, r));
    }
    return 0;
}