Cod sursa(job #3134254)

Utilizator Alex_Cristea72Cristea Alexandru Alex_Cristea72 Data 28 mai 2023 20:08:09
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>


using namespace std;

vector<vector<int>> proc_RMQ(const vector<int> &input) {
    int N = input.size();
    int logN = log2(N) + 1;

    vector<vector<int>> RMQmatrice(N, vector<int>(logN, 0));

    for (int i = 0; i < N; i++) {
        RMQmatrice[i][0] = input[i];
    }

    for (int j = 1; (1 << j) <= N; j++) {
        for (int i = 0; (i + (1 << j) - 1) < N; i++) {
            RMQmatrice[i][j] = min(RMQmatrice[i][j - 1], RMQmatrice[i + (1 << (j - 1))][j - 1]);
        }
    }

    return RMQmatrice;
}

int RmQquery(const vector<vector<int>> &rmqTable, int x, int y) {
    int k = log2(y - x + 1);
    return min(rmqTable[x][k], rmqTable[y - (1 << k) + 1][k]);
}

int main() {
    ifstream f1("../rmq.in");
    ofstream f2("../rmq.out");

    int N, M;
    f1 >> N >> M;

    vector<int> input(N);
    for (int i = 0; i < N; i++) {
        f1 >> input[i];
    }

    vector<vector<int>> rmqTable = proc_RMQ(input);

    while (M--) {
        int x, y;
        f1 >> x >> y;
        int min_el = RmQquery(rmqTable, x - 1, y - 1);
        f2 << min_el << endl;
    }

    f1.close();
    f2.close();

    return 0;
}