Cod sursa(job #2880008)

Utilizator vladstefanVlad Oros vladstefan Data 29 martie 2022 12:27:49
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb

// problema RMQ
// solutie de

#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <deque>

using namespace std;

#define NMax 100000
#define LogNMax 17

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

int n, m;
int v[NMax + 3], rmq[LogNMax + 3][NMax + 3];

void input() {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) fin >> v[i];
}

void init() {
    int q;
    for (int i = 1; i <= n; ++i) rmq[0][i] = v[i];
    for (int p = 1; p <= LogNMax; ++p) {
        q = 1 << p;
        for (int i = 1; i <= n - q + 1; ++i) rmq[p][i] = min(rmq[p - 1][i], rmq[p - 1][i + q / 2]);
    }
}

int rangemin(int a, int b) {
    int p;
    for (p = 0; (1 << (p + 1)) <= (b - a + 1); ++p);
    return min(rmq[p][a], rmq[p][b - (1 << p) + 1]);
}

void solve() {
    int a, b;
    for (int i = 1; i <= m; ++i) {
        fin >> a >> b;
        fout << rangemin(a, b) << '\n';
    }
}

int main() {
    input();
    init();
    solve();
}