Cod sursa(job #2749914)

Utilizator VanillaSoltan Marian Vanilla Data 8 mai 2021 22:36:20
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;

string __fname = "rmq";
ifstream in (__fname + ".in");
ofstream out (__fname + ".out");
#define cin in
#define cout out

template <class T> class rmq {
    private: 
        vector <vector <T> > dp;
        vector <T> a;

    public:
        rmq(vector <T> in) {
            int n = in.size();
            a = in;
            vector <vector <T> > __dp(n, vector <T> (log2(n) + 1));
            dp = __dp;
            for (int i = 0; i < n; i++) {
                dp[i][0] = a[i];
            }
            for (int j = 1; j <= log2(n); j++) {
                for (int i = 0; i + (1 << j) <= n; i++) {
                    dp[i][j] = min(dp[i][j-1], dp[i + (1 << (j - 1))][j-1]);
                }
            }
        }

        T get_min(int l, int r) {
            int pw = log2(r - l + 1);
            T rs = min(dp[l][pw], dp[r - (1 << pw) + 1][pw]);
            return rs;
        }
};
 
void solve(int id){

    return;
}
 
 
int main(){
    // ios_base::sync_with_stdio(0);cin.tie(0);
    int n,q;
    cin >> n >> q;
    vector <int> a (n);
    for (int i = 0; i < n; i++){
        cin >> a[i];
    }
    rmq <int> rq (a);
    while (q--) {
        int l,r;
        cin >> l >> r;
        cout << rq.get_min(l - 1, r -1) << "\n";
    }
    return 0;
}