Cod sursa(job #2745261)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 26 aprilie 2021 11:21:38
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
using namespace std;

const int NMAX = 1e5;
const int LGMAX = 18;
int N, M, log2[NMAX + 2];
vector <int> rmq[LGMAX + 5];
void BuildRmq() {
    log2[1] = 0;
    for(int i = 2; i <= N; i++) {
        log2[i] = 1 + log2[i / 2];
    }
    for(int i = 1; i <= LGMAX; i++) {
        if((1 << i) > (int)rmq[0].size()) { break; }
        for(int j = 0; j < (int)rmq[0].size(); j++) {
            if (j + (1 << i) > (int)rmq[0].size()) { break; }
            else {
                rmq[i].push_back(min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]));
            }
        }
    }
}
int QueryRmq(int x, int y) {
    if(x > y) { swap(x, y); }
    int k = log2[y - x + 1];
    return min(rmq[k][x], rmq[k][y - (1 << k) + 1]);
}

int main() {
    ifstream f("rmq.in"); ofstream g("rmq.out");
    f >> N >> M;
    for(int i = 1; i <= N; i++) {
        int x; f >> x;
        rmq[0].push_back(x);
    }
    BuildRmq();
    for(int i = 1; i <= M; i++) {
        int x, y; f >> x >> y;
        g << QueryRmq(x - 1, y - 1) << '\n';
    }
    return 0;
}