Cod sursa(job #3279700)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 24 februarie 2025 01:33:08
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

struct stackRMQ {
    vector<int> rmq[17];
    int len = 0;
    stackRMQ() {}
    void push(int x) {
        rmq[0].push_back(x);
        for (int i = 1; (1 << i) <= len + 1; ++i)
            rmq[i].push_back(min(rmq[i - 1][len - (1 << i) + 1], rmq[i - 1][len - (1 << (i - 1)) + 1]));
        len++;
    }
    void pop() {
        assert(len > 0);
        for (int i = 0; (1 << i) <= len; ++i)
            rmq[i].pop_back();
        len--;
    }
    int query(int i, int j) {
        int k = log2(j - i + 1);
        return min(rmq[k][i], rmq[k][j - (1 << k) + 1]);
    }
};

int main() {
    int n, q;
    fin >> n >> q;
    stackRMQ rmq;
    for (int i = 0; i < n; ++i) {
        int x;
        fin >> x;
        rmq.push(x);
    }
    for (int i = 0; i < q; ++i) {
        int l, r;
        fin >> l >> r;
        fout << rmq.query(l - 1, r - 1) << "\n";
    }
}