Pagini recente » Clasament Summer Challenge 2009, Runda 3 | Cod sursa (job #1530544) | Razvy | Cod sursa (job #426847) | Cod sursa (job #1399569)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 200003;
int V[NMAX];
class range_minimum_query {
int *RMQ[30], *lg;
public:
range_minimum_query (int *T, const int &N) {
int i, j, k = 1;
lg = new int[N + 1];
lg[1] = 0;
for (i = 2; i <= N; ++i)
lg[i] = lg[i / 2] + 1;
RMQ[0] = T;
for (i = 1; N - 2 * k + 1> 0; ++i) {
RMQ[i] = new int[N - k + 1];
for (j = 1; j <= N - 2 * k + 1; ++j)
RMQ[i][j] = min (RMQ[i - 1][j], RMQ[i - 1][j + k]);
k <<= 1;
}
}
inline int query (const int &left, const int &right) {
return min (RMQ[lg[right - left + 1]][left], RMQ[lg[right - left + 1]][right + 1 - (1 << lg[right - left + 1])]);
}
};
range_minimum_query *RMQ;
int main () {
freopen ("rmq.in", "r", stdin);
freopen ("rmq.out", "w", stdout);
int N, Q, i, a, b;
scanf ("%d%d", &N, &Q);
for (i = 1; i <= N; ++i)
scanf ("%d", V + i);
RMQ = new range_minimum_query (V, N);
while (Q--) {
scanf ("%d%d", &a, &b);
printf ("%d\n", RMQ->query (a, b));
}
}