Cod sursa(job #2622774)

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

using namespace std;

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

struct Query {
    int left;
    int right;
};

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[], Query query) {
    int j = int(log2(query.right - query.left + 1));

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

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

    int m;
    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++) {
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d\n", query(v, Query{a - 1, b - 1}));
    }
}