Cod sursa(job #1988119)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 2 iunie 2017 08:57:56
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>

using namespace std;

const int nMax = 100005;
const int logMax = 20;

int log[nMax];

class rmq
{
public:
    rmq(int vec[], int sz)
    {
        v = new int[sz + 1];
        for(int i = 1; i <= sz; ++i)
            v[i] = vec[i];
        for(int i = 0; (1 << i) <= sz; ++i)
            mn[i] = new int[sz + 1];
        n = sz;
        if(log[2] == 0)
            SetLog();
        Update();
    }
    ~rmq()
    {
        delete[] v;
        for(int i = 1; (1 << i) <= n; ++i)
            delete[] mn[i];
    }
    int Query(int st, int dr)
    {
        int partSize = log[dr - st + 1];
        return min(mn[partSize][st], mn[partSize][dr - (1 << partSize) + 1]);
    }
private:
    void Update()
    {
        for(int i = 1; i <= n; ++i)
            mn[0][i] = v[i];
        for(int i = 1; (1 << i) <= n; ++i)
            for(int j = 1; j + (1 << i) - 1 <= n; ++j)
                mn[i][j] = min(mn[i-1][j], mn[i-1][j + (1 << (i - 1))]);
    }
    void SetLog()
    {
        log[1] = 0;
        for(int i = 2; i <= n; ++i)
            log[i] = log[i/2] + 1;
    }
    int * v;
    int n;
    int * mn[logMax];
};

int v[nMax];

int main()
{
    ifstream in("rmq.in");
    ofstream out("rmq.out");
    int n, m;
    in >> n >> m;
    for(int i = 1; i <= n; ++i)
        in >> v[i];
    rmq r(v, n);
    int x, y;
    for(int i = 1; i <= m; ++i)
    {
        in >> x >> y;
        out << r.Query(x, y) << "\n";
    }

    return 0;
}