Cod sursa(job #2478436)

Utilizator melutMelut Zaid melut Data 22 octombrie 2019 02:39:35
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>


using namespace std;


char const *inFile = "rmq.in";
char const *outFile = "rmq.out";


ifstream Read(inFile);
ofstream Write(outFile);


void Compute(
    vector<vector<unsigned>> &table,
    unsigned const n
) {
    unsigned log2n = log2(n) + 1;
    unsigned i, j;

    table.resize(log2n);
    table[0].resize(n);

    for (i = 0; i < n; ++i) {
        Read >> table[0][i];
    }

    for (i = 1; i < log2n; ++i) {
        table[i].resize(n - (1 << i) + 1);

        for (j = 0; j < table[i].size(); ++j) {
            table[i][j] = min(table[i - 1][j], table[i - 1][j + (1 << (i - 1))]);
        }
    }
}


void Solve(
    vector<vector<unsigned>> &table,
    unsigned m
) {
    vector<unsigned> log_vec(table[0].size());

    for (unsigned i = 2; i < log_vec.size(); ++i) {
        log_vec[i] = log_vec[i >> 1] + 1;
    }

    unsigned left;
    unsigned right;
    unsigned row;

    while (m--) {
        Read >> left;
        Read >> right;

        --left;
        --right;

        row = log_vec[right - left + 1];

        Write << min(table[row][left], table[row][right - (1 << row) + 1]) << '\n';
    }
}


int main() {
    unsigned n;
    unsigned m;
    Read >> n;
    Read >> m;

    vector<vector<unsigned>> table;

    Compute(table, n);

    Solve(table, m);

    Read.close();
    Write.close();

    return 0;
}