Cod sursa(job #2606612)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 28 aprilie 2020 09:45:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <stdio.h>

using namespace std;

const int NMAX = 100005;
const int MMAX = 1000005;

int rmq[17][NMAX], log2[MMAX], v[NMAX];

int main() {

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

    int n, i, j, jj, l, pp, rez, m, p, q;

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

    for (j = 1; j <= n; j++) {
        for (i = 0; (1<<i) <= j; i++) {
            if (i == 0)
                rmq[i][j] = v[j];
            else {
                jj = j - (1<<(i - 1));
                rmq[i][j] = min(rmq[i - 1][jj], rmq[i - 1][j]);
            }
        }
    }

    log2[1] = 0;
    for (i = 2; i <= n; i++)
        log2[i] = 1 + log2[i / 2];

    for (i = 1; i <= m; i++) {
        scanf ("%d%d", &p, &q);
        l = log2[q - p + 1];
        pp = p + (1<<l) - 1;
        rez = min(rmq[l][pp], rmq[l][q]);
        printf ("%d\n", rez);
    }

    return 0;
}