Cod sursa(job #1329582)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 29 ianuarie 2015 17:50:29
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>

#define Lmax 18
#define Nmax 100100

using namespace std;

class RangeMinimumQuery {

    private:
        int size, * Log2, ** Rmq;

    public:
        RangeMinimumQuery(int Size) {

            size = Size;

            Log2 = new int[size + 1];
            for(int i = 2; i <= size; i++)
                Log2[size] = Log2[size >> 1] + 1;

            Rmq = new int * [Log2[size] + 1];
            for(int i = 0; i <= Log2[size]; i++)
                Rmq[i] = new int[size + 1];
        }

        void process() {

            int i, j;

            for(i = 2; i <= size; i++)
                Log2[i] = Log2[i >> 1] + 1;

            for(i = 1; i <= Log2[size]; i++)
                for(j = 1; j <= size - (1 << i) + 1; j++)
                    Rmq[i][j] = min(Rmq[i - 1][j], Rmq[i - 1][j + (1 << (i-1))]);

        }

        void update(int index, int value) {
            Rmq[0][index] = value;
        }

        int query(int x, int y) {
            int l = Log2[y - x + 1];
            return min(Rmq[l][x], Rmq[l][y - (1 << l) + 1]);
        }
};

int main() {

    int i, x, y, queries, N;
    ifstream in("rmq.in");
    ofstream out("rmq.out");

    in >> N >> queries;
    RangeMinimumQuery rmq(N);

    for(i = 1; i <= N; i++) {
        in >> x;
        rmq.update(i, x);
    }

    for(rmq.process(); queries--; ) {
        in >> x >> y;
        out << rmq.query(x, y) << '\n';
    }

    in.close();
    out.close();

    return 0;
}