Cod sursa(job #2064024)

Utilizator alexandru223Dan Alexandru Dicu alexandru223 Data 11 noiembrie 2017 18:34:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>
using namespace std;
const int MAX_VAL = 1e5+4;
const int log_MAX_VAL = 19;
int arr[MAX_VAL];
int comp_arr[MAX_VAL][log_MAX_VAL];
int biggest_pwr[MAX_VAL];
int main() {
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int n, q;
    scanf("%d%d", &n, &q);
    int k = 1;
    for (int i = 0; i < n; i++) {
        if ((1<<k) < (i+1)) k++;
        biggest_pwr[i+1] = k-1;
        scanf("%d", &arr[i]);
    }
    for (int i = 0; i < n; i++) comp_arr[i][0] = arr[i];
    int m = 1;
    while ((1<<m) <= n) {
        for (int i = 0; i < n-(1<<m)+1; i++)
            comp_arr[i][m] = min(comp_arr[i][m-1], comp_arr[i+(1<<(m-1))][m-1]);
        m++;
    }
    for (int i = 0; i < q; i++) {
        int fi, la;
        scanf("%d%d", &fi, &la);
        fi--; la--;
        int k = biggest_pwr[la-fi+1];
        printf("%d\n", min(comp_arr[fi][k], comp_arr[la-(1<<k)+1][k]));
    }
    return 0;
}