Pagini recente » Cod sursa (job #3038708) | Cod sursa (job #1521223) | Cod sursa (job #2383182) | Cod sursa (job #387443) | Cod sursa (job #3144114)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int N_MAX = 1e5;
const int LOG_MAX = 17;
template<typename T>
class OptimizedSparseTable{
private:
T table[N_MAX][LOG_MAX];
char lb[N_MAX + 1];
T (* merge)(T, T);
public:
OptimizedSparseTable(T (* func)(T, T)){
merge = func;
}
void build(int n, ifstream& fin){
lb[1] = 0;
for(int i = 2; i <= n; ++i)
lb[i] = lb[i / 2] + 1;
for(int i = 0; i < n; ++i)
fin >> table[i][0];
for(int e = 1; e < LOG_MAX; ++e)
for(int i = 0; i < n - (1 << (e - 1)); ++i)
table[i][e] = merge(table[i][e - 1], table[i + (1 << (e - 1))][e - 1]);
}
T query(int left, int right){
int e = lb[right - left + 1];
T result = merge(table[left][e], table[right - (1 << e) + 1][e]);
return result;
}
};
int min(int a, int b){
return (a < b) ? a : b;
}
OptimizedSparseTable<int> rmq(min);
int main(){
int n, queries, left, right;
fin >> n >> queries;
rmq.build(n, fin);
for(int i = 0; i < queries; ++i){
fin >> left >> right;
fout << rmq.query(left - 1, right - 1) << '\n';
}
fin.close();
fout.close();
return 0;
}