Pagini recente » Cod sursa (job #199868) | Cod sursa (job #2987466) | Cod sursa (job #1520140) | Cod sursa (job #2829826) | Cod sursa (job #2771330)
#include <bits/stdc++.h>
using namespace std;
const int mxN = 1e5 + 5, LOG = 17;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M, nums[mxN], dp[mxN][LOG], Log[mxN]; //dp[i][j] -> cel mai mic numar de la i la 2^j
void query(int left, int right) {
//trebuie sa gasesc puterea cea mai mare pana la lungimea x - yh
int length = right - left + 1;
int putere = Log[length];
fout << min(dp[left][putere], dp[right - (1 << putere) + 1][putere]) << '\n';
}
int main() {
ios::sync_with_stdio(false), fin.tie(nullptr), fout.tie(0);
fin >> N >> M;
for (int i = 2; i <= N; ++i) {
Log[i] = Log[i / 2] + 1;
}
for (int i = 0; i < N; ++i) {
fin >> nums[i];
dp[i][0] = nums[i];
}
for (int k = 1; k < LOG; k++) {
for (int i = 0; i + (1 << k) - 1 < N; ++i) {
dp[i][k] = min(dp[i][k - 1], dp[i + (1 << (k - 1))][k - 1]);
}
}
while (M--) {
int x, y; fin >> x >> y; --x, --y;
query(x, y);
}
return 0;
}