Cod sursa(job #1149286)

Utilizator nytr0gennytr0gen nytr0gen Data 21 martie 2014 16:47:12
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#define INF 100001
#define Nmax 100000
#define logNmax 18

using namespace std;

inline int log2(int val) {
    return 31 - __builtin_clz(val);
}

inline int min(int a, int b) {
    if (a < b) {
        return a;
    } else {
        return b;
    }
}

int main() {
    FILE * fr = fopen("rmq.in", "r");
    FILE * fw = fopen("rmq.out", "w");

    int n, q, i, j;
    int b[logNmax][Nmax];
    fscanf(fr, "%d %d", &n, &q);
    for (i = 0; i < n; ++i) {
        fscanf(fr, "%d", &b[0][i]);
    }

    int k = log2(n);
    for (i = 1; i <= k; ++i) {
        for (j = 0; j < n && j+(1<<(i-1)) < n; j++) {
            b[i][j] = min(b[i-1][j], b[i-1][j+(1<<(i-1))]);
        }
    }

    int st, dr, ret;
    for (i = 0; i < q; ++i) {
        fscanf(fr, "%d%d", &st, &dr);
        --st; --dr;

        k = log2(dr-st+1);
        ret = min(b[k][st], b[k][dr-(1<<k)+1]);

        fprintf(fw, "%d\n", ret);
    }

    return 0;
}