Cod sursa(job #2998743)

Utilizator AleXutzZuDavid Alex Robert AleXutzZu Data 9 martie 2023 22:23:03
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <vector>
#include <fstream>


struct RMQ {
private:
    std::vector<int> log;
    std::vector<int> *v;
    std::vector<std::vector<int>> mat;

public:
    explicit RMQ(std::vector<int> *const input) {
        this->v = input;

        size_t size = input->size();

        log.resize(2, 0);

        for (int i = 2; i <= size; ++i) {
            log.push_back(log[i / 2] + 1);
        }

        mat.resize(log.back() + 1, std::vector<int>(size + 1, 0));

        for (int i = 1; i <= size; ++i) {
            mat[0][i] = i;
        }

        for (int i = 1; i <= log.back(); ++i) {
            for (int j = 1; j <= size; ++j) {
                if (j + (1 << (i - 1)) > size) continue;
                if ((*v)[mat[i - 1][j]] < (*v)[mat[i - 1][j + (1 << (i - 1))]]) {
                    mat[i][j] = mat[i - 1][j];
                } else mat[i][j] = mat[i - 1][j + (1 << (i - 1))];
            }
        }
    }

    int query(int left, int right) {
        int log_diff = log[right - left];
        if ((*v)[mat[log_diff][left]] < (*v)[mat[log_diff][right + 1 - (1 << log_diff)]]) {
            return mat[log_diff][left];
        }
        return mat[log_diff][right + 1 - (1 << log_diff)];
    }
};


int main() {
    std::ifstream input("rmq.in");
    std::ofstream output("rmq.out");

    std::vector<int> v;
    int n, q;
    input >> n >> q;
    v.resize(n + 1, 0);

    for (int i = 1; i <= n; ++i) input >> v[i];

    RMQ rmq(&v);

    while (q--) {
        int x, y;
        input >> x >> y;
        output << v[rmq.query(x, y)] << '\n';
    }

    return 0;
}