Cod sursa(job #2871101)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 12 martie 2022 21:06:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

std::fstream in ("rmq.in", std::ios::in) ;
std::fstream out ("rmq.out", std::ios::out | std::ios::binary) ;

template <typename T>
class RMQ {
    std::vector<T> lg ;
    std::vector<std::vector<T> > rmq ;

    T minim(T a, T b) {
        return (a + (b - a) * (b < a)) ;
    }

public:
    RMQ(int n, std::vector<T> v) {
        lg.push_back(0) ;
        lg.push_back(0) ;
        rmq = std::vector<std::vector<T>>(1 + int(log2(n)), std::vector<T>(n + 1)) ;
        for (int i = 1 ; i <= n ; ++ i) {
            rmq[0][i] = v[i] ;
            lg.push_back(lg[(i + 1) / 2] + 1) ;
        }
        for (int len = 1 ; (1 << len) <= n ; ++ len) {
            for (int i = 1 ; i + (1 << len) - 1 <= n ; ++ i) {
                rmq[len][i] = minim(rmq[len - 1][i], rmq[len - 1][i + (1 << (len - 1))]) ;
            }
        }
    }

    T query(int left, int right) {
        int intLen = lg[right - left + 1] ;
        return minim(rmq[intLen][left], rmq[intLen][right - (1 << intLen) + 1]) ;
    }
};

void solve() {
    int n, querys ;
    in >> n >> querys ;
    std::vector<int> vec(n + 1) ;
    for (int i = 1 ; i <= n ; ++ i) {
        in >> vec[i] ;
    }
    RMQ<int> rmq(n, vec) ;
    for (int i = 1, x, y ; i <= querys ; ++ i) {
        in >> x >> y ;
        out << rmq.query(x, y) << '\n' ;
    }
}

int main() {
    int testcases(1) ;
    for ( ; testcases ; -- testcases) {
        solve() ;
    }
}