Cod sursa(job #1173921)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 21 aprilie 2014 10:54:42
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define NMAX 100002
#define LMAX 18

long int rmq[LMAX][NMAX], n, m, lg[NMAX], a[NMAX], i, j, l, x, y, diff, sh;

int main() {
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

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

    for(i = 1;i <= n;i++) {
        scanf("%ld ", &a[i]);
    }

    for(i = 1;i <= n;i++) {
        rmq[0][i] = a[i];
    }

    lg[1] = 0;
    for(i = 2;i <= n;i++) {
        lg[i] = lg[i / 2] + 1;
    }

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

    for(i = 1;i <= m;i++) {
        scanf("%ld %ld",&x,&y);

        diff = y - x + 1;
        l = lg[diff];
        sh = diff - (1 << l);
        printf("%ld\n", min(rmq[l][x],rmq[l][x + sh]) );
    }

    return 0;
}