Cod sursa(job #583566)

Utilizator nandoLicker Nandor nando Data 20 aprilie 2011 22:03:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>
using namespace std;

#define MAXN 100010
#define MAXL 18
#define min(a, b) (((a) < (b)) ? (a) : (b))

int log[MAXN], rmq[MAXL][MAXN], n, m;

FILE* fin = fopen ("rmq.in", "r");
FILE* fout = fopen ("rmq.out", "w");

int main ()
{
    fscanf (fin, "%d %d\n", &n, &m);

    log[0] = -1;
    for (int i = 1; i <= n; ++i) {
        log[i] = log [i >> 1] + 1;
        fscanf (fin, "%d ", &rmq[0][i]);
    }

    for (int i = 1; (1 << i) <= n; ++i) {
        for (int j = 1; j <= n - (1 << i) + 1; ++j) {
            rmq[i][j] = min (rmq[i - 1][j], rmq[i - 1][j + (1 << i - 1)]);
        }
    }

   for (int i = 1, x, y, diff; i <= m; ++i) {
        fscanf (fin, "%d %d\n", &x, &y);
        diff = y - x + 1;
        fprintf (fout, "%d\n", min (rmq[log[diff]][x], rmq[log[diff]][x + diff - (1 << log[diff])]));
   }

    fclose (fin);
    fclose (fout);
    return 0;
}