Pagini recente » Cod sursa (job #972307) | Cod sursa (job #1316563) | Cod sursa (job #1243059) | Cod sursa (job #52755) | Cod sursa (job #3144112)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int N_MAX = 1e5;
const int LOG_MAX = 17;
const int VAL_MAX = 1e5;
template<typename T>
class SparseTable{
private:
T table[N_MAX][LOG_MAX];
T identityElement{};
T (* merge)(T, T);
public:
SparseTable(T (* func)(T, T)){
merge = func;
}
SparseTable(T (* func)(T, T), T _identityElement){
merge = func;
identityElement = _identityElement;
}
void build(int n, ifstream& fin){
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){
T result = identityElement;
for(int e = LOG_MAX - 1; e >= 0; --e)
if((1 << e) <= right - left + 1){
result = merge(result, table[left][e]);
left += 1 << e;
}
return result;
}
};
int min(int a, int b){
return (a < b) ? a : b;
}
SparseTable<int> rmq(min, VAL_MAX + 1);
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;
}