Pagini recente » Cod sursa (job #2942349) | Cod sursa (job #3210328) | Cod sursa (job #966281) | Cod sursa (job #2682203) | Cod sursa (job #2612149)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#define MAXV 100001
using namespace std;
vector<int> vals;
int *stree;
int construct(int l, int r, int i){
if(l==r){
stree[i] = vals[l];
return vals[l];
}
int mid = l+(r-l)/2;
stree[i] = min(construct(l, mid, i*2+1),construct(mid+1, r, i*2+2));
return stree[i];
}
int rmq(int l, int r, int qs, int qe, int i){
if (qs <= l && qe >= r)
return stree[i];
if (r < qs || l > qe)
return MAXV;
int mid = l+(r-l)/2;
return min(rmq(l, mid, qs, qe, 2*i+1), rmq(mid+1, r, qs, qe, 2*i+2));
}
int main() {
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, x;
/// Read data
fin>>n>>m;
for(int i=0;i<n;++i){
fin>>x;
vals.push_back(x);
}
/// Resize and construct tree
x = 2*static_cast<int>(pow(2, ceil(log2(n))) - 1);
stree = new int(x);
construct(0, n-1, 0);
/// Walk tree for every range
int qs, qe;
while(m--){
fin>>qs>>qe;
fout<<rmq(0, n-1,qs-1, qe-1, 0)<<'\n';
}
return 0;
}