Cod sursa(job #2841061)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 29 ianuarie 2022 11:36:22
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 1e5;
int a[NMAX + 5];
vector <int> RMQ[20], log2;
void build(int* v, int n) {
    int p = 1; log2.resize(n + 1, 0);
    while((p <<= 1) <= n) log2[p] = 1;
    for(int i = 1; i <= n; i++)log2[i] += log2[i - 1];
    RMQ[0].resize(n + 1);
    for(int i = 1; i <= n; i++) RMQ[0][i] = v[i];
    int h = log2[n];
    for(int j = 1; j <= h; j++) {
        int jj = 1 << j - 1, nj = n - (1 << j) + 1;
        RMQ[j].resize(nj + 1);
        for(int i = 1; i <= nj; i++) RMQ[j][i] = min(RMQ[j - 1][i], RMQ[j - 1][i + jj]);
    }
}
int query(int l, int r) {
    int h = log2[r - l + 1];
    return min(RMQ[h][l], RMQ[h][r - (1 << h) + 1]);
}

int main()
{
    int n, q, l, r;
    fin >> n >> q;
    for(int i = 1; i <= n; i++) fin >> a[i];
    build(a, n);
    for(int i = 1; i <= q; i++)
        fin >> l >> r,
        fout << query(l, r) << "\n";
    return 0;
}