Pagini recente » Cod sursa (job #2092328) | Cod sursa (job #2977042) | Cod sursa (job #1974423) | Cod sursa (job #1010577) | Cod sursa (job #1329582)
#include <fstream>
#define Lmax 18
#define Nmax 100100
using namespace std;
class RangeMinimumQuery {
private:
int size, * Log2, ** Rmq;
public:
RangeMinimumQuery(int Size) {
size = Size;
Log2 = new int[size + 1];
for(int i = 2; i <= size; i++)
Log2[size] = Log2[size >> 1] + 1;
Rmq = new int * [Log2[size] + 1];
for(int i = 0; i <= Log2[size]; i++)
Rmq[i] = new int[size + 1];
}
void process() {
int i, j;
for(i = 2; i <= size; i++)
Log2[i] = Log2[i >> 1] + 1;
for(i = 1; i <= Log2[size]; i++)
for(j = 1; j <= size - (1 << i) + 1; j++)
Rmq[i][j] = min(Rmq[i - 1][j], Rmq[i - 1][j + (1 << (i-1))]);
}
void update(int index, int value) {
Rmq[0][index] = value;
}
int query(int x, int y) {
int l = Log2[y - x + 1];
return min(Rmq[l][x], Rmq[l][y - (1 << l) + 1]);
}
};
int main() {
int i, x, y, queries, N;
ifstream in("rmq.in");
ofstream out("rmq.out");
in >> N >> queries;
RangeMinimumQuery rmq(N);
for(i = 1; i <= N; i++) {
in >> x;
rmq.update(i, x);
}
for(rmq.process(); queries--; ) {
in >> x >> y;
out << rmq.query(x, y) << '\n';
}
in.close();
out.close();
return 0;
}