Pagini recente » Cod sursa (job #2425301) | Cod sursa (job #2280502) | Cod sursa (job #1079063) | Cod sursa (job #2634678) | Cod sursa (job #3295800)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int rmq[NMAX + 1][17];
int v[NMAX + 1];
ifstream f("rmq.in");
ofstream g("rmq.out");
//rmq[i][j] = minimul secventei care incepe la pozitia i si are lungime 2^j
int query_1(int x, int y) {
int len = y - x + 1;
int p = log2(len);
//[x, y] = [x, x + 2^p - 1] U [y - 2^p + 1, y]
return min(rmq[x][p], rmq[y - (1 << p) + 1][p]);
}
int query_log(int x, int y) {
int len = y - x + 1;
int mn = 1e9;
for(int i = 0; (1 << i) <= len; i++) {
if(len & (1 << i)) {
mn = min(mn, rmq[x][i]);
x += (1 << i);
}
}
return mn;
}
int main() {
int n, m;
f >> n >> m;
for(int i = 1; i <= n; i++) {
f >> v[i];
}
//initializam coloana 0 din rmq cu valorile din v
for(int i = 1; i <= n; i++) {
rmq[i][0] = v[i];
}
for(int j = 1; j <= int(log2(n)); j++) {
for(int i = 1; i <= n - (1 << j) + 1; i++) {
rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}
}
for(int i = 1; i <= m; i++) {
int x, y;
f >> x >> y;
g << query_1(x, y) << '\n';
}
return 0;
}