Cod sursa(job #1644519)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 9 martie 2016 23:49:21
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
# include <cstdio>
# define min(a, b)  (a < b ? a : b)
using namespace std;

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

const int MAXN = 100005;
const int LOGN = 17;
int rmq[LOGN][MAXN];
int kmax[MAXN];
int n, m, a, b;
int i, j, k;

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

    // D[i][j] = minimul incepand cu pozitia j a primelor 2^i elemente
    for (i=1; (1<<i)<=n; ++i)
        for (j=1; j+(1<<i)-1<=n; ++j) {
            k = (1<<(i-1));
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+k]);
        }

    // kmax[i] = k maxim a.i. 2^k <= i
    kmax[2] = 1;
    for (i=3; i<=n; ++i)
        kmax[i] = 1 + kmax[i/2];

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

        k = kmax[(b-a+1)];
        j = b-(1<<k)+1;

        if (rmq[k][a] < rmq[k][j])
            fprintf(fout, "%d\n", rmq[k][a]);
        else
            fprintf(fout, "%d\n", rmq[k][j]);
    }
    return 0;
}