Pagini recente » Cod sursa (job #1987003) | Cod sursa (job #3306456) | Cod sursa (job #3310111) | Cod sursa (job #1725355) | Cod sursa (job #3349912)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int D[NMAX + 1][18];
//D[i][j] = minimul pe intervalul care incepe la i si are lungime 2^j
//D[i][j] = min(D[i][j - 1], D[i + 2^(j - 1)][j - 1])
//log2(i) = log2(i / 2) + 1
int L[NMAX + 1];
int query1(int x, int y) {
int len = y - x + 1;
//int p = L[len];
int p = log2(len);
int a = D[x][p]; //[x, x + 2^p - 1]
int b = D[y - (1 << p) + 1][p]; //[y - 2^p + 1, y]
return min(a, b);
}
int query2(int x, int y) {
int len = y - x + 1;
int mn = 1e9;
for(int p = L[len]; p >= 0 && len > 0; p--) {
if((1 << p) <= len) {
mn = min(mn, D[x][p]);
x += (1 << p);
len -= (1 << p);
}
}
return mn;
}
int main() {
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, q;
cin >> n >> q;
//L[1] = 0;
for(int i = 1; i <= n; i++) {
cin >> D[i][0];
// if(i > 1) {
// L[i] = L[i / 2] + 1;
// }
}
for(int j = 1; (1 << j) <= n; j++) {
for(int i = 1; i + (1 << j) - 1 <= n; i++) {
D[i][j] = min(D[i][j - 1], D[i + (1 << (j - 1))][j - 1]);
}
}
for(int i = 1; i <= q; i++) {
int x, y;
cin >> x >> y;
cout << query1(x, y) << '\n';
}
return 0;
}