Cod sursa(job #2622778)

Utilizator MevasAlexandru Vasilescu Mevas Data 1 iunie 2020 19:58:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <cmath>
#include <iostream>

using namespace std;

int lookup[100000][17];
int v[100000];
int n;

void preprocess(const int arr[]) {
    for(int i = 0; i < n; i++) {
        lookup[i][0] = i;
    }

    for(int j = 1; (1 << j) <= n; j++) {
        for(int i = 0; i + (1 << j) - 1 < n; i++) {
            if(arr[lookup[i][j - 1]] < arr[lookup[i + (1 << (j - 1))][j - 1]]) {
                lookup[i][j] = lookup[i][j - 1];
            } else {
                lookup[i][j] = lookup[i + (1 << (j - 1))][j - 1];
            }
        }
    }
}

int query(int arr[], int left, int right) {
    int j = int(log2(right - left + 1));

    if(arr[lookup[left][j]] <= arr[lookup[right - (1 << j) + 1][j]]) {
        return arr[lookup[left][j]];
    } else {
        return arr[lookup[right - (1 << j) + 1][j]];
    }
}

int main() {
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    int m, a, b;
    scanf("%d %d", &n, &m);

    for(int i = 0; i < n; i++) {
        scanf("%d", &v[i]);
    }

    preprocess(v);

    for(int i = 0; i < m; i++) {
        scanf("%d %d", &a, &b);
        printf("%d\n", query(v, a - 1, b - 1));
    }
}