Cod sursa(job #3231534)

Utilizator BogdancxTrifan Bogdan Bogdancx Data 26 mai 2024 23:09:45
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

#define qwes
const string file = "rmq";

#ifdef qwe
    ifstream fin("../test.in");
    ofstream fout("../output.out");
#else
    ifstream fin(file + ".in");
    ofstream fout(file + ".out");
#endif

class RMQ {
public:
    RMQ() = delete;
    explicit RMQ(const vector<int> &v) : rmq{vector<vector<int>>(18, vector<int>(v.size() + 1, 0))} {
        int n = v.size();

        for(int i = 1; i <= n; i++) {
            rmq[0][i] = v[i-1];
        }

        for(int i = 1; (1<<i) <= n; i++) {
            for(int j = 1; j <= n; j++) {
                int len = j + (1<<(i-1));

                if(len <= n)
                    rmq[i][j] = min(rmq[i-1][j], rmq[i-1][len]);
            }
        }

        E.resize(n + 1, 0);
        E[1] = 0;

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

    int query(int left, int right) const {
        int e = E[right - left + 1];

        return min(rmq[e][left], rmq[e][right - (1<<e) + 1]);
    }
private:
    vector<vector<int>> rmq;
    vector<int> E;
};

int main() {

    int n, k;
    fin >> n >> k;
    vector<int>v(n);
    for(int i = 0; i < n; i++) {
        fin>>v[i];
    }
    RMQ rmq{v};

    for(int i = 0; i < k ; i++) {
        int a, b;

        fin >> a >> b;

        fout << rmq.query(a, b) << '\n';
    }

    return 0;
}