Cod sursa(job #1161107)

Utilizator cbanu96Banu Cristian cbanu96 Data 31 martie 2014 00:20:30
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#define FILEIN "rmq.in"
#define FILEOUT "rmq.out"
#define NMAX 100005
#define LGNMAX 18
#define INF 0x3f3f3f3f

using namespace std;

int RMQ[NMAX][LGNMAX];
int N, M;
int V[NMAX];
int LG[NMAX];

void precompute() {
    memset(RMQ, INF, sizeof(RMQ));

    for ( int i = 1; i <= N; i++ ) {
        RMQ[i][0] = V[i];
    }

    for ( int j = 1; (1 << j) <= N; j++ ) {
        for ( int i = 1; (1 << (j-1)) + i <= N; i++ ) {
            RMQ[i][j] = min(RMQ[i][j-1], RMQ[i + (1 << (j-1))][j-1]);
        }
    }
}

int main() {
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

    scanf("%d %d", &N, &M);
    for ( int i = 1; i <= N; i++ ) scanf("%d", &V[i]);

    precompute();

    for ( int i = 2; i <= N; i++ ) {
        LG[i] = LG[i/2] + 1;
    }

    for ( int x, y; M; M-- ) {
        scanf("%d %d", &x, &y);

        int k = LG[y-x+1];

        printf("%d\n", min(RMQ[x][k], RMQ[y - (1<<k) + 1][k]));
    }

    return 0;
}