Cod sursa(job #1439108)

Utilizator stefanzzzStefan Popa stefanzzz Data 21 mai 2015 14:50:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#define MAXN 100005
#define MAXLOGN 18
#define MIN(a, b) (((a) < (b))?(a):(b))
using namespace std;

int n, m, v[MAXN], rmq[MAXLOGN][MAXN];
int l, r, log2[MAXN];

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

    scanf("%d %d", &n, &m);
    for(i = 1; i <= n; i++) {
        scanf("%d ", &v[i]);
        rmq[0][i] = v[i];
    }

    for(k = 1; (1 << k) <= n; k++) {
        for(i = 1; i <= n; i++) {
            rmq[k][i] = rmq[k - 1][i];
            if(i + (1 << (k - 1)) <= n && rmq[k - 1][i + (1 << (k - 1))] < rmq[k][i])
                rmq[k][i] = rmq[k - 1][i + (1 << (k - 1))];
        }
    }

    for(i = 1, j = 1; i <= n; i++) {
        if(i >= (1 << j)) ++j;
        log2[i] = j - 1;
    }

    while(m--) {
        scanf("%d %d\n", &l, &r);
        int x = log2[r - l + 1];
        printf("%d\n", MIN(rmq[x][l], rmq[x][r - (1 << x) + 1]));
    }

    return 0;
}