Cod sursa(job #2172058)

Utilizator Andrei17Andrei Pascu Andrei17 Data 15 martie 2018 14:53:19
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <math.h>
#include <climits>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

const int N = 100001, LOG = (int)(log2(100001));

int n, m, nheap, h[N], v[N], poz[N], minim[N][20], logg;

void precalc() {
    for (int i = 1; i <= n; i++) {
        minim[i][0] = v[i];
        std::fill(minim[i] + 1, minim[i] + logg + 1, INT_MAX);
    }

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

int main()
{
    in >> n >> m;
    logg = (int)(log2(n));
    for (int i = 1; i <= n; i++) in >> v[i];
    precalc();

    int st, dr;
    for (int i = 0; i < m; i++) {
        in >> st >> dr;
        int lg = (int)(log2(dr - st));
        out << min(minim[st][lg], minim[st + lg][lg]) << '\n';
    }
    in.close();
    out.close();
}