Cod sursa(job #2169197)

Utilizator dorin31Geman Dorin Andrei dorin31 Data 14 martie 2018 14:00:46
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <iostream>
#include <fstream>
#define maxLog 18
#define maxN 100001

using namespace std;

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

int n, m, x, y, diff, l, k;
int rmq[maxLog][maxN], log[maxLog];

inline int min(int x, int y) {
    return x < y ? x : y;
}

int main() {
    fin >> n >> m;
    for (int i = 1 ; i <= n ; ++i)
        fin >> rmq[0][i];

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

    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)] );

    while (m--) {
        fin >> x >> y;
        diff = y - x + 1;
        l = log[diff];
        k = diff - (1<<l);
        fout << min( rmq[l][x] , rmq[l][x + k] ) << '\n';
    }

    return 0;
}