Cod sursa(job #2478430)

Utilizator melutMelut Zaid melut Data 22 octombrie 2019 01:57:24
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 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
) {
    unsigned left;
    unsigned right;
    unsigned length;
    unsigned min_val;
    unsigned index;
    unsigned i;

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

        --left;
        --right;

        length = right - left + 1;
        min_val = (1LL << 31) - 1;
        index = left;

        for (i = 0; (1 << i) <= length; ++i) {
            if (length & (1 << i)) {
                min_val = min(min_val, table[i][index]);
                index += (1 << i);
            }
        }

        Write << min_val << '\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;
}