Cod sursa(job #3236827)

Utilizator TomMMMMatei Toma TomMMM Data 2 iulie 2024 16:32:34
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.81 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N_max = 1000005, LOG = 19;
int rmq[LOG][N_max];
int log[N_max];

void createlog() {
    log[1] = 0;
    for(int i = 1; i <= N_max - 1; i++)log[i] = log[i / 2] + 1;
}
int get_min(int x, int y){
    int l = log[x - y + 1];
    return min(rmq[l][x], rmq[l][y - (1 << l) + 1]);
}

int main() {
    createlog();
    int n, m;
    fin >> n >> m;
    for(int i = 1; i <= n; i++){
        fin >> rmq[0][i];
    }
    int lo = log[n];
    for(int l = 1; l <= lo; l++) {
        for(int i = 1; i <= n - (1 << l) + 1; i++) {
            rmq[l][i] = min(rmq[l - 1][i], rmq[l - 1][i + (1 << (l - 1))]);
        }
    }
    while(m--) {
        int x, y;
        fin >> x >> y;
        fout << get_min(x, y) << '\n';
    }
}