Pagini recente » Cod sursa (job #513450) | Borderou de evaluare (job #202316) | Cod sursa (job #2988118) | Cod sursa (job #260270) | Cod sursa (job #3134107)
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
int rmq[100000][17], n, m,x,y;
ifstream f("rmq.in");
ofstream g("rmq.out");
void citire() {
for (int i = 0; i < n; i++) {
f >> rmq[i][0];
}
}
void RMQ() {
for (int i = 1; i <= int(log2(n)); i++) {
for (int j = 0; j < n - int(pow(2, i - 1)); j++) {
int stanga = rmq[j][i - 1], dreapta = rmq[j + int(pow(2, i - 1))][i - 1];
if (stanga < dreapta) {
rmq[j][i] = stanga;
}
else {
rmq[j][i] = dreapta;
}
}
}
}
int query(int a, int b) {
int l = b - a + 1;
int index = int(log2(l));
int stanga = rmq[a][index], dreapta = rmq[b - int(pow(2, index)) + 1][index];
if (stanga < dreapta ) {
return stanga;
}
return dreapta;
}
int main() {
f >> n >> m;
citire();
RMQ();
for (int i = 0; i < m; i++) {
f >> x >> y;
x--;
y--;
g << query(x, y) << endl;
}
f.close();
g.close();
}