Cod sursa(job #2372037)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 6 martie 2019 21:00:43
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

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

class RMQ
{
public:
    vector <vector <int>> m_rmq;
    int m_size;

    int query(int l, int r)
    {
        int max_pow = 31 - __builtin_clz(r - l + 1);

        return min(m_rmq[max_pow][l], m_rmq[max_pow][r - (1 << max_pow) + 1]);

    }

    void insert_line(int i)
    {
        int len = (1 << i);

        vector <int> ans(m_size - len + 1);
        for(int k = 0; k + len - 1 < m_size; k++)
            ans[k] = min(query(k, k + (1 << (i - 1)) - 1), query(k + len - (1 << (i - 1)), k + len - 1));

        m_rmq.push_back(ans);

    }

    RMQ(int n, vector <int> &rmq)
    {
        m_rmq.push_back(rmq);
        m_size = n;
        for(int i = 1; (1 << i) <= m_size; i++)
        {
            insert_line(i);
        }
    }
};

int main()
{

    int n, q;
    fin>>n>>q;
    vector <int> v(n);
    for(int i = 0; i < n; i++)
        fin>>v[i];

    RMQ rmq(n, v);

    int x, y;
    for(int i = 0; i < q; i++)
    {
        fin>>x>>y;
        fout<<rmq.query(x - 1, y - 1)<<'\n';
    }
    return 0;
}