Cod sursa(job #2932078)

Utilizator trifangrobertRobert Trifan trifangrobert Data 1 noiembrie 2022 21:09:44
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 1e5;
const int LGMAX = 18;
int N, Q;
int lg[NMAX + 5];
int rmq[LGMAX][NMAX + 5];

void Build() {
    for (int i = 2; i <= N; ++i) {
        lg[i] = lg[i >> 1] + 1;
    }
    for (int p = 1; (1 << p) <= N; ++p) {
        for (int i = 1; i + (1 << p) - 1 <= N; ++i) {
            rmq[p][i] = min(rmq[p - 1][i], rmq[p - 1][i + (1 << (p - 1))]);
        }
    }
    
}

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

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    int N, Q;
    fin >> N >> Q;
    for (int i = 1; i <= N; ++i) {
        fin >> rmq[0][i];
    }
    Build();
    while (Q-- > 0) {
        int a, b;
        fin >> a >> b;
        fout << Query(a, b) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}