Pagini recente » Cod sursa (job #2979553) | Cod sursa (job #1887525) | Cod sursa (job #722774) | Cod sursa (job #686728) | Cod sursa (job #3169698)
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int LMAX = 100005;
int v[LMAX], rmq[LMAX][20];
int main() {
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
for (int i = 1; i < n; i++) {
rmq[i][0] = min(v[i], v[i+1]);
}
rmq[n][0] = v[n];
for (int j = 1; j <= 19; j++) {
for (int i = 1; i <= n; i++) {
if (i + (1<<(j-1)) > n) {
rmq[i][j] = rmq[i][j-1];
}
else {
rmq[i][j] = min(rmq[i][j-1], rmq[i+(1<<(j-1))][j-1]);
}
}
}
//la rmq[i][j] am elem min din intervalul [x, x + 2^j lea element]
while (m--) {
int x, y, mini;
fin >> x >> y;
mini = v[x];
int j = 19, shift = (1<<j);
while (x < y) {
while (j >= 0 && x + shift > y) {
j--;
shift = (shift>>1);
}
mini = min(mini, rmq[x][j]);
x = x + shift + 1;
}
mini = min(mini, v[y]);
fout<<mini<<endl;
}
fin.close();
fout.close();
return 0;
}