Cod sursa(job #3209635)

Utilizator Sabin1133Padurariu Sabin Sabin1133 Data 3 martie 2024 07:19:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

class rmq {
private:
    std::vector<std::vector<int>> dp;
    int sz;
    int lg;

public:
    rmq()
    {
        this->dp.push_back({});
    }

    void add(int val)
    {
        this->dp[0].push_back(val);
    }

    void preprocess()
    {
        this->sz = this->dp[0].size();

        for (this->lg = 0; 1 << (this->lg + 1) <= this->sz; ++this->lg) {}

        for (int j = 1; j <= this->lg; ++j) {
            dp.push_back({});
            dp.back().resize(this->sz);
        }

        for (int j = 1; j <= this->lg; ++j)
            for (int i = 0; i + (1 << (j - 1)) < this->sz; ++i)
                this->dp[j][i] = std::min(this->dp[j - 1][i], this->dp[j - 1][i + (1 << (j - 1))]);

    }

    /**
     * indexarea trebuie facuta de la 0
    */
    int rangemin(int l, int r)
    {
        int log, range;

        range = r - l + 1;

        for (log = 0; (1 << (log + 1)) <= range; ++log) {}

        return std::min(this->dp[log][l], this->dp[log][r - (1 << log) + 1]);
    }

    int size()
    {
        return this->dp.size();
    }

    void show()
    {
        for (int j = 0; j <= this->lg; ++j) {
            for (int i = 0; i < this->sz; ++i)
                std::cout << this->dp[j][i] << ' ';
            std::cout << '\n';
        }
    }
};

int main()
{
    int n, m;
    rmq ds;

    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");

    fin >> n >> m;

    for (int x, i = 0; i < n; ++i) {
        fin >> x;
        ds.add(x);
    }

    ds.preprocess();

    for (int l, r, i = 0; i < m; ++i) {
        fin >> l >> r;

        fout << ds.rangemin(l - 1, r - 1) << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}