Cod sursa(job #2802170)

Utilizator Horia14Horia Banciu Horia14 Data 17 noiembrie 2021 18:06:28
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cctype>
using namespace std;

class sparseTable {
private:
    vector<int> number;
    vector<vector<int>> sparse;

public:
    int getLog(int elem) {
        return 31 - __builtin_clz(elem);
    }

    void addNumber(int i, int val) {
        number[i] = val;
    }

    sparseTable(int Size) {
        int log = getLog(Size);
        number.resize(Size);
        sparse.resize(Size);
        for(int i = 0; i < Size; ++i)
            sparse[i].resize(1 + log);
    }

    int getMin(int i, int j) {
        int firstValue = sparse[i][j - 1];
        int secondValue = sparse[i + (1 << (j - 1))][j - 1];
        if(number[firstValue] < number[secondValue])
            return firstValue;

        return secondValue;
    }

    void buildSparseTable() {
        for(int i = 0; i < number.size(); ++i)
            sparse[i][0] = i;

        for(int j = 1; (1 << j) <= number.size(); ++j)
            for(int i = 0; i + (1 << j) - 1 < number.size(); ++i)
                sparse[i][j] = getMin(i, j);
    }


    int RMQ(int Begin, int End) {
        int l = End - Begin + 1;
        int k = getLog(l);
        if(number[sparse[Begin][k]] < number[sparse[Begin + l - (1 << k)][k]])
            return number[sparse[Begin][k]];

        return number[sparse[Begin + l - (1 << k)][k]];
    }

};



int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    int n, m, x, y;
    fin >> n >> m;
    sparseTable* objSparseTable = new sparseTable(n);
    for(int i = 0; i < n; ++i) {
        fin >> x;
        objSparseTable->addNumber(i, x);
    }

    objSparseTable->buildSparseTable();

    for(int i = 0; i < m; ++i) {
        fin >> x >> y;
        fout << objSparseTable->RMQ(x - 1, y - 1) << "\n";
    }
    delete objSparseTable;

    return 0;
}