Cod sursa(job #2775675)

Utilizator Vlad.Vlad Cristian Vlad. Data 16 septembrie 2021 18:28:33
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
#define NMAX 100000
#define LMAX 20
#define INF 99999999
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M;
int d[NMAX][LMAX];
void read() {
    fin >> N >> M;
    for (int i = 0; i < N; ++i) {
        fin >> d[i][0];
    }
}
void create() {
    for (int j = 1; (1 << j) < N; ++j) {
        for (int i = 0; i < N; ++i) {
            if (i + (1 << (j - 1))< N) {
                d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
            }
        }
    }
}
int query(int x, int y) {
    int mini = INF;
    int dist = (y - x) + 1;
    for (int j = LMAX; j >= 0; --j) {
        if ((1 << j) <= dist) {
            mini = min(mini, d[x][j]);
            x = x + (1 << j);
            dist -= (1 << j);
        }
    }
    return mini;
}
int main()
{
    read();
    create();
    int x, y;
    for (int i = 0; i < M; ++i) {
        fin >> x >> y;
        fout << query(x - 1, y - 1) << "\n";
    }
    return 0;
}