Pagini recente » Cod sursa (job #1407400) | Cod sursa (job #2158904) | Cod sursa (job #243054) | Cod sursa (job #499036) | Cod sursa (job #3349905)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int D[NMAX + 1][20];
int L[NMAX + 1];
//log2(i) = log2(i / 2) + 1
//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])
int query1(int x, int y) {
int len = y - x + 1;
int p = L[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 = 20; p >= 0; p--) {
if((1 << p) <= len) {
int a = D[x][p];//[x, x + 2^p - 1]
mn = min(mn, a);
x += (1 << p); // x = x + 2^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 << query2(x, y) << '\n';
}
return 0;
}