Cod sursa(job #2294903)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 2 decembrie 2018 22:17:44
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

class RMQ
{
    // variables
private:
    int m_size;
    vector <vector <int>> m_rmq_matrix;
    // functions

public:
    void initialize(vector <int> &first_line)
    {
        m_size = first_line.size();
        m_rmq_matrix.push_back(first_line);

        // add the rest of the lines
        for(int i = 1; (1<<i) <= m_size; i++)
        {
            addLine(i);

        }


    }

    int query(int i, int j)
    {
        int row = 31 - __builtin_clz(j-i+1);
        return min(m_rmq_matrix[row][i], m_rmq_matrix[row][j - (1<<row) + 1]);
    }


    RMQ()
    {}
    RMQ(vector <int> &first_line)
    {
        initialize(first_line);
    }

    ~RMQ()
    {}
private:
    void addLine(int line)
    {
        vector <int> new_line;
        for(int i = 0, j = i + (1<<line) - 1; j < m_size; i++, j++)
            new_line.push_back(min(query(i, j - (1<<(line - 1))), query(j - (1<<(line - 1)) + 1, j)));

        m_rmq_matrix.push_back(new_line);
    }
};

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



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

    RMQ rmq(v);

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

    return 0;
}