Cod sursa(job #2602725)

Utilizator lev.tempfliTempfli Levente lev.tempfli Data 17 aprilie 2020 18:12:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

template<class T>
class Range_minimum_query {
public:
    explicit Range_minimum_query(std::vector<T> &arr);

    T query(int i, int j);

private:
    std::vector<std::vector<T>> lookup;
};

template<class T>
Range_minimum_query<T>::Range_minimum_query(std::vector<T> &arr) {
    lookup.resize(arr.size(), std::vector<T>(log2(arr.size()) + 1));
    for (int i = 0; i < arr.size(); i++) {
        lookup[i][0] = arr[i];
    }
    for (int j = 1; j < lookup[0].size(); j++) {
        for (int i = 0; i <= lookup.size() - (1 << j); i++) {
            lookup[i][j] = std::min(lookup[i][j - 1], lookup[i + (1 << j) / 2][j - 1]);
        }
    }
}

template<class T>
T Range_minimum_query<T>::query(int i, int j) {
    int lg = log2(j - i + 1);
    return std::min(lookup[i][lg], lookup[j - (1 << lg) + 1][lg]);
}

int main() {
    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");

    std::vector<int> a;
    int n, m;
    fin >> n >> m;
    a.resize(n);
    for (int i = 0; i < n; i++) fin >> a[i];

    Range_minimum_query<int> rmq(a);
    int f, g;
    for (int i = 0; i < m; i++) {
        fin >> f >> g;
        fout << rmq.query(f - 1, g - 1) << "\n";
    }

    return 0;
}