Cod sursa(job #2351825)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 22 februarie 2019 18:47:37
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

class RMQ {
 private:
    vector < int > logVec;
    vector < vector < int > > rmqVec;

 public:
    RMQ(vector < int > _RMQ){
        logVec.assign(_RMQ.size() + 1, 0);
        for (int i = 2; i < logVec.size(); i++) {
            logVec[i] = logVec[i / 2] + 1;
        }

        rmqVec.assign(logVec.back() + 1, vector < int >(_RMQ.size()));
        rmqVec[0] = _RMQ;

        for (int logX = 1; logX < rmqVec.size(); logX++) {
            for (int i = 0; i + (1 << logX) <= _RMQ.size(); i++) {
                rmqVec[logX][i] = min(rmqVec[logX - 1][i], rmqVec[logX - 1][i + (1 << (logX - 1))]);
            }
        }
    }

    int getMin(int l, int r) { // ! returns the answer for the interval [l, r) !
        int logX = logVec[r - l];
        return min(rmqVec[logX][l], rmqVec[logX][r - (1 << logX)]);
    }
};

vector < int > V;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    ifstream cin("rmq.in");
    ofstream cout("rmq.out");

    int n, m;
    cin >> n >> m;

    for (int i = 1, x; i <= n; i++) {
        cin >> x;
        V.push_back(x);
    }

    RMQ rmq(V);

    while (m--) {
        int x, y;
        cin >> x >> y;
        cout << rmq.getMin(x - 1, y) << "\n";
    }

    return 0;
}