Cod sursa(job #3229185)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 14 mai 2024 11:34:01
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>

using namespace std;

const int INF = 1e9;

/// I know that this isn't practical, but it is only infoarena
ifstream cin("rmq.in");
ofstream cout("rmq.out");

class RMQ
{
private:
    int n_size;
    int log_2;
    vector<vector<int>> rmq;

    int GetLog2(int n)
    {
        int curent_log_2 = 0;
        while((1 << curent_log_2) < n)
            curent_log_2++;
        return curent_log_2;
    }
public:
    RMQ() : n_size(0), log_2(0) {};

    RMQ(int n_size, vector<int> &elements)
    {
        this->n_size = n_size;
        this->log_2 = GetLog2(n_size);
        rmq.resize(n_size, vector<int>(log_2, INF));

        for(int i = 0; i < n_size; i++)
            rmq[i][0] = elements[i];

        for(int k = 1; k <= log_2; k++)
            for(int i = 0; i + (1 << k) - 1 < n_size; i++)
                rmq[i][k] = min(rmq[i][k - 1], rmq[i + (1 << (k - 1))][k - 1]);
    }

    int QueryMin(int left, int right)
    {
        int k = GetLog2(right - left + 1) - 1;
        return min(rmq[left][k], rmq[right - (1 << k) + 1][k]);
    }
};

int main() {

    int n, Q;
    cin >> n >> Q;

    vector<int> elements(n);
    for(int i = 0; i < n; i++)
        cin >> elements[i];

    RMQ my_rmq(n, elements);
    while(Q--)
    {
        int left, right;
        cin >> left >> right;

        left--; right--;
        cout << my_rmq.QueryMin(left, right) << '\n';
    }

    return 0;
}

/// PS: Daca vezi asta bro, da-mi si mie debug please!