Cod sursa(job #1644472)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 9 martie 2016 23:32:30
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
// D[i][j] = minimul incepand cu pozitia j a primelor 2^i elemente

# include <cstdio>
# include <iostream>
# include <cstring>
# include <algorithm>
# include <cmath>

using namespace std;

FILE *fin = fopen("rmq.in", "rt");
FILE *fout = fopen("rmq.out", "wt");

const int MAXN = 100005;
const int LOGN = 17;
int v[MAXN];
int D[LOGN][MAXN];
int n, m, a, b;
int minn;
int i, j, k;

int main() {
    fscanf(fin, "%d%d", &n, &m);
    for (i=1; i<=n; ++i) {
        fscanf(fin, "%d", &v[i]);
        D[0][i] = v[i];
    }

    int logn = log(n) + 1;
    for (i=1; i<=logn; ++i)
        for (j=1; j<=n-(1<<i)+1; ++j)
            D[i][j] = min(D[i-1][j], D[i-1][j+(1<<(i-1))]);

    for (i=1; i<=m; ++i) {
        fscanf(fin, "%d%d", &a, &b);

        for (k=1; (1<<k)<=b-a; ++k)
            ;

        --k;
        fprintf(fout, "%d\n", min(D[k][a], D[k][b-(1<<k)+1]));
    }
    return 0;
}