Pagini recente » Cod sursa (job #821322) | Cod sursa (job #1907011) | Cod sursa (job #2095971) | Cod sursa (job #3212091) | Cod sursa (job #2763166)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, nq;
int const NMAX = 1e5;
int v[1 + NMAX];
int rmq[32][1 + NMAX];
void buildRMQ() {
int shift = 1;
for(int j = 1;j <= 17;j++) {
for(int i = 1;i + shift - 1 <= n;i++){
if(shift == 1){
rmq[j][i] = v[i];
}else{
rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i + shift / 2]);
}
//cout << rmq[j][i] << ' ';
}
//cout << '\n';
shift = shift * 2;
}
}
int get2pow(int s, int &x) {
int ans = 0;
if(s == 1){
x = 1;
return 1;
}
while(s >= 2){
s /= 2;
x *= 2;
ans++;
}
return ans;
}
int computeRMQ(int left, int right) {
int length = right - left + 1, shift = 1;
int j = get2pow(length, shift);
//cout << length << ' ' << j << ' ' << shift << ' ';
shift /= 2;//Gub gub
return min(rmq[j][left], rmq[j][right - shift + 1]);
}
int main() {
int x, y;
in >> n >> nq;
for(int i = 1;i <= n;i++){
in >> v[i];
}
buildRMQ();
//printRMQ();
for(int i = 1;i <= nq;i++){
in >> x >> y;
out << computeRMQ(x, y) << '\n';
}
return 0;
}