Cod sursa(job #2819658)

Utilizator 2016Teo@Balan 2016 Data 18 decembrie 2021 19:49:48
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using namespace std;

#define x1 "rmq.in"
#define x2 "rmq.out"

ifstream in(x1);
ofstream out(x2);

#define MAXN 100000
#define MAXL 17


int v[MAXN], rmq[MAXN][MAXL], lg2[MAXN], n;

void prelog() {
    lg2[1] = 0;
    for(int i = 2; i <= n; i++)
        lg2[i] = lg2[i / 2] + 1;
}

inline int cond(int a, int b) {
    return a < b ? a : b;
}

void build() {
    for(int i = 0; i < n; i++)
        rmq[i][0] = v[i];

    for(int j = 1; j <= MAXL; j++)
        for(int i = 0; i + (1 << j) - 1 < n; i++)
            rmq[i][j] = cond(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}

int query(int st, int dr) {
    int lg = lg2[dr - st + 1];

    return cond(rmq[st][lg], rmq[dr - (1 << lg) + 1][lg]);
}

int main() {
    int a, b, i, q;

    in >> n >> q;

    for(i = 0; i < n; i++)
        in >> v[i];

    prelog();
    build();

    while(q--) {
        in >> a >> b;
        out << query(a - 1, b - 1) << '\n';

    }
    return 0;
}