Cod sursa(job #1674712)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 4 aprilie 2016 20:21:45
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <algorithm>
#define N_MAX 100003
#define MIN(a, b) (a < b ? a : b)

int n, m;
int v[N_MAX];
int rmq[18][N_MAX];
int log[N_MAX];

inline void citire();
inline void calcRmq();
inline void calcLog();

int main()
{
    citire();
    calcRmq();
    calcLog();

    int a, b;

    for (int i = 1; i <= m; ++i){
        scanf("%d%d", &a, &b);
        if (a > b) std::swap(a, b);
        int l = log[b-a+1];
        printf("%d\n", MIN(rmq[l][a],
                           rmq[l][b - (1 << l) + 1]));
    }
    return 0;
}

inline void citire(){
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; ++i) scanf("%d", v+i);
}

inline void calcRmq(){
    int i, j;

    for (j = 1; j <= n; ++j) rmq[0][j] = v[j];

    for (i = 1; (1 << i) <= n; ++i){
        for (j = 1; j + (1 << (i)) <= n + 1; ++j){
            rmq[i][j] = MIN(rmq[i-1][j], rmq[i-1][j + (1 << (i - 1))]);
        }
    }
}

inline void calcLog(){
    log[1] = 0;
    for (int i = 2; i <= n; ++i) log[i] = log[i/2] + 1;
}