Pagini recente » Cod sursa (job #2632627) | Cod sursa (job #3031871) | Cod sursa (job #1783752) | Cod sursa (job #48162) | Cod sursa (job #2478430)
#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;
}