Cod sursa(job #2645771)

Utilizator ursu2001Ursu Ianis-Vlad ursu2001 Data 29 august 2020 16:00:05
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;

/* CLASS BUILD FOR INTEGRATING IT IN OTHER PROBLEMS THAT REQUIER RMQ */

template<class dataType>
class RMQ
{
private:
    uint_fast32_t N;
    uint_fast8_t K;


    vector<uint_fast8_t> log_base_2;

    void build_log_base_2()
    {
        log_base_2.resize(N + 1, 0);

        for(uint_fast32_t i = 2; i <= N; ++i)
        {
            log_base_2[i] = log_base_2[i >> 1] + 1;
        }

    }


    vector<vector<dataType>> rmq;

    void build_rqm(vector<dataType>& data)
    {
        rmq.resize(K + 1, vector<dataType>(N + 1));

        for(uint_fast32_t i = 1; i <= N; ++i)
            rmq[0][i] = data[i];

        for(uint_fast8_t k = 1; k <= K; ++k)
            for(uint_fast32_t i = 1; i <= N; ++i)
                rmq[k][i] = min(rmq[k - 1][i], rmq[k - 1][i + (1 << (k - 1))]);
    }


public:
    RMQ(vector<dataType>& data)
    {
        N = data.size();

        build_log_base_2();

        K = log_base_2[N];

        build_rqm(data);

    }


    dataType query(uint_fast32_t left, uint_fast32_t right)
    {
        uint_fast32_t k = log_base_2[right - left + 1];

        return min(rmq[k][left], rmq[k][right - (1 << k) + 1]);
    }
};



int main()
{
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");

    ios_base::sync_with_stdio(false);
    fin.tie(NULL);


    uint_fast32_t N, M;
    fin >> N >> M;


    vector<uint_fast32_t> v(N + 1);

    for(uint_fast32_t i = 1; i <= N; ++i)
        fin >> v[i];


    RMQ<uint_fast32_t> rmq(v);


    for(uint_fast32_t i = 1; i <= M; ++i)
    {
        uint_fast32_t x, y;
        fin >> x >> y;

        fout << rmq.query(x, y) << '\n';
    }

}