Cod sursa(job #3134282)

Utilizator CiprianHutanuHutanu Ciprian CiprianHutanu Data 28 mai 2023 20:39:44
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>

std::ifstream in;
std::ofstream out;

std::vector<std::vector<int>> buildRMQ(const std::vector<int>& v){
    int n = v.size();
    int m = log2(n) + 1;
    std::vector<std::vector<int>> RMQ(m, std::vector<int>(n));
    for(int i = 0; i< n; i++)
        RMQ[0][i] = v[i];
    for(int j = 1; j <= m; j++)
        for(int i = 0; i + (1<<j) - 1 < n; i++)
            RMQ[j][i] = std::min(RMQ[j-1][i], RMQ[j-1][i + (1<<j) - 1]);
    return RMQ;

}


int main() {
    int n, m, i, a, b;
    in.open("rmq.in");

    in>>n>>m;
    std::vector<int> v(n);
    for(i=0;i<n;i++){
        in>>v[i];
    }
    std::vector<std::vector<int>> RMQ = buildRMQ(v);
    out.open("rmq.out");

    for(i = 0; i < m; i++){
        in>>a>>b;
        int k = log2(b - a + 1);
        if(RMQ[k][b - (1<<k)] == 0)
            out<<RMQ[k][a - 1]<<'\n';
        else
            out<<std::min(RMQ[k][a - 1],RMQ[k][b - (1<<k)])<<'\n';
    }
    in.close();
    out.close();

    return 0;
}