Cod sursa(job #1743592)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 18 august 2016 14:02:25
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <cstring>

using namespace std;

constexpr int kMaxN = 100000;

int rmq[18][kMaxN];
int lg[kMaxN + 1];

int main() {
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");
    cin.tie(0);
    ios_base::sync_with_stdio(false);

    int N, M; cin >> N >> M;
    for (int i = 0; i < N; i += 1) {
        cin >> rmq[0][i];
    }
    
    lg[1] = 0;
    for (int i = 2; i <= N; i += 1) {
        lg[i] = lg[i >> 1] + 1;
    }

    for (int i = 1; (1 << i) < N; i += 1) {
        for (int j = 0; j + (1 << i) <= N; j += 1) {
            if (rmq[i - 1][j] < rmq[i - 1][j + (1 << (i - 1))]) {
                rmq[i][j] = rmq[i - 1][j];
            } else {
                rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
            }
        }
    }

    for (int i = 0; i < M; i += 1) {
        int x, y; cin >> x >> y;
        x--; y--;
        const int query_log = lg[y - x + 1];
        cout << (rmq[query_log][x] < rmq[query_log][y - (1 << query_log) + 1] ?
                 rmq[query_log][x] : rmq[query_log][y - (1 << query_log) + 1]) << '\n';
    }
    return 0;
}