Cod sursa(job #1940624)

Utilizator savigunFeleaga Dragos-George savigun Data 26 martie 2017 18:29:09
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
using namespace std;

int n, nq;
int m[100005][18], v[100005], lg[100005];


void logs() {
    for (int i = 2; i <= n; ++i) {
        lg[i] = lg[i / 2] + 1;
    }
}

void preprocess_rmq() {
    logs();

    for (int i = 1; i <= n; ++i) m[i][0] = v[i];

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

int rmq(int i, int j) {
    int l = i - j + 1;
    int k = lg[l];
    return min(m[i][k], m[j - (1 << k) + 1][k]);
}


int main() {
    ifstream in("rmq.in");
    ofstream out("rmq.out");

    in >> n >> nq;
    for (int i = 1; i <= n; ++i) in >> v[i];

    preprocess_rmq();

    for (int q = 1, i, j; q <= nq; ++q) {
        in >> i >> j;
        out << rmq(i, j) << '\n';
    }

    return 0;
}