Cod sursa(job #1399569)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 24 martie 2015 20:10:42
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int NMAX = 200003;

int V[NMAX];

class range_minimum_query {

    int *RMQ[30], *lg;

public:

    range_minimum_query (int *T, const int &N) {

        int i, j, k = 1;
        lg = new int[N + 1];
        lg[1] = 0;
        for (i = 2; i <= N; ++i)
            lg[i] = lg[i / 2] + 1;
        RMQ[0] = T;
        for (i = 1; N - 2 * k + 1> 0; ++i) {
            RMQ[i] = new int[N - k + 1];
            for (j = 1; j <= N - 2 * k + 1; ++j)
                RMQ[i][j] = min (RMQ[i - 1][j], RMQ[i - 1][j + k]);
            k <<= 1;
        }


    }

    inline int query (const int &left, const int &right) {

        return min (RMQ[lg[right - left + 1]][left], RMQ[lg[right - left + 1]][right + 1 - (1 << lg[right - left + 1])]);

    }

};

range_minimum_query *RMQ;

int main () {

    freopen ("rmq.in", "r", stdin);
    freopen ("rmq.out", "w", stdout);
    int N, Q, i, a, b;
    scanf ("%d%d", &N, &Q);
    for (i = 1; i <= N; ++i)
        scanf ("%d", V + i);
    RMQ = new range_minimum_query (V, N);
    while (Q--) {
        scanf ("%d%d", &a, &b);
        printf ("%d\n", RMQ->query (a, b));
    }

}