Pagini recente » Cod sursa (job #2927409) | Cod sursa (job #2632661) | Cod sursa (job #1057341) | Cod sursa (job #120197) | Cod sursa (job #2802170)
#include <iostream>
#include <fstream>
#include <vector>
#include <cctype>
using namespace std;
class sparseTable {
private:
vector<int> number;
vector<vector<int>> sparse;
public:
int getLog(int elem) {
return 31 - __builtin_clz(elem);
}
void addNumber(int i, int val) {
number[i] = val;
}
sparseTable(int Size) {
int log = getLog(Size);
number.resize(Size);
sparse.resize(Size);
for(int i = 0; i < Size; ++i)
sparse[i].resize(1 + log);
}
int getMin(int i, int j) {
int firstValue = sparse[i][j - 1];
int secondValue = sparse[i + (1 << (j - 1))][j - 1];
if(number[firstValue] < number[secondValue])
return firstValue;
return secondValue;
}
void buildSparseTable() {
for(int i = 0; i < number.size(); ++i)
sparse[i][0] = i;
for(int j = 1; (1 << j) <= number.size(); ++j)
for(int i = 0; i + (1 << j) - 1 < number.size(); ++i)
sparse[i][j] = getMin(i, j);
}
int RMQ(int Begin, int End) {
int l = End - Begin + 1;
int k = getLog(l);
if(number[sparse[Begin][k]] < number[sparse[Begin + l - (1 << k)][k]])
return number[sparse[Begin][k]];
return number[sparse[Begin + l - (1 << k)][k]];
}
};
int main() {
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, x, y;
fin >> n >> m;
sparseTable* objSparseTable = new sparseTable(n);
for(int i = 0; i < n; ++i) {
fin >> x;
objSparseTable->addNumber(i, x);
}
objSparseTable->buildSparseTable();
for(int i = 0; i < m; ++i) {
fin >> x >> y;
fout << objSparseTable->RMQ(x - 1, y - 1) << "\n";
}
delete objSparseTable;
return 0;
}