Pagini recente » Cod sursa (job #2027812) | Cod sursa (job #2848580) | Cod sursa (job #2116370) | Cod sursa (job #2720368) | Cod sursa (job #2478436)
#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;
}