Cod sursa(job #2349223)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 20 februarie 2019 11:55:57
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

using namespace std;

const int MAXN = 100010, LOGN = 20;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, q, matrix[LOGN][MAXN], log[MAXN];

/// i -> 2 la puterea i = numarul de elemente in interval
/// j -> pozitia de la care incepe intervalul

inline int doMin(int a, int b) {
    if (a < 1)
        return b;
    if (b < 1)
        return a;
    return (a < b ? a : b);
}

void fillMatrix() {
    for (int i = 1; (1 << i) <= n; i++) {
        for (int j = 0; j + (1 << i) - 1 < n; j++) {
            matrix[i][j] = doMin(matrix[i - 1][j], matrix[i - 1][j + (1 << (i - 1))]);
        }
    }
}

void fillLog() {
    for (int i = 2; i <= n; i++)
        log[i] = log[i / 2] + 1;
}

int doRmq(int l, int r) {
    int k = log[r - l + 1];
    return doMin(matrix[k][l], matrix[k][r - (1 << k) + 1]);
}

int main() {
    fin >> n >> q;
    for (int j = 0; j < n; j++)
        fin >> matrix[0][j];
    fillMatrix();
    fillLog();
    for (int i = 1 ; i <= q; i++) {
        int l, r;
        fin >> l >> r;
        fout << doRmq(l - 1 , r - 1) << "\n";
    }
    return 0;
}