Cod sursa(job #1251129)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 28 octombrie 2014 23:19:44
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

#define Nmax 100100
#define Lmax 18
#define log2 Log2[B - A + 1]

using namespace std;

int N;

class Rmq {

    private:
        int Rmq[Lmax][Nmax], Log2[Nmax];

    public:

        void insert(int X, int Value) {

            Rmq[0][X] = Value;

        }

        void process() {

            int i, j;

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

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

        }

        int query(int A, int B) {

            int l = log2;
            return min(Rmq[l][A], Rmq[l][B - (1 << l) + 1]);

        }

} rmq;

int main() {

    int i, x, y, M;

    ifstream in("rmq.in");
    ofstream out("rmq.out");
    in >> N >> M;

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

    rmq.process();

    while(M--) {

        in >> x >> y;
        out << rmq.query(x, y) << '\n';

        }

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

    return 0;

}