Cod sursa(job #2645929)

Utilizator ursu2001Ursu Ianis-Vlad ursu2001 Data 30 august 2020 09:29:07
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;


class RMQ
{
    int N, K;
    vector<vector<int>> rmq;

public:
    RMQ(vector<int>& data)
    {
        N = data.size() - 1;
        K = log2(N);

        rmq.resize(K + 1, vector<int>(N + 1));

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

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


    int query(int left, int right)
    {
        if(left > right) swap(left, right);

        int k = log2(right - left + 1);

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


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

    int N, M;
    fin >> N >> M;

    vector<int> v(N + 1);

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

    RMQ rmq(v);

    for(int i = 1; i <= M; ++i)
    {
        int left, right;
        fin >> left >> right;

        fout << rmq.query(left, right) << '\n';
    }
}