Pagini recente » Cod sursa (job #2666924) | Cod sursa (job #2060150) | Cod sursa (job #176402) | Cod sursa (job #1513184) | Cod sursa (job #1488767)
#include <cstdio>
#define NMAX 100010
#define ELEMMAX 100010
#define MMAX 1000010
#define LOGMAX 17
#define min(x,y) ((x) < (y) ? (x) : (y))
int v[NMAX], rmq[NMAX][LOGMAX]; //minimul pentru secventa de lungime 2 ^ j care incepe de pe pozitia i
int N, M;
int log[ELEMMAX];
int main () {
freopen ("rmq.in", "r", stdin);
freopen ("rmq.out", "w", stdout);
log[0] = log[1] = 0;
log[2] = 1;
for (int i = 3; i < ELEMMAX; i++) {
log[i] = log[i / 2] + 1;
}
scanf ("%d%d", &N, &M);
for (int i = 1; i <= N; i++) {
scanf ("%d", &v[i]);
rmq[i][0] = v[i];
}
for (int j = 1; j <= log[N]; j++) {
for (int i = 1; i + (1 << j) <= N + 1; i++) {
rmq[i][j] = min (rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}
}
int x, y;
for (int i = 1; i <= M; i++) {
scanf ("%d%d", &x, &y);
int k = log[y - x + 1];
int ans = min (rmq[x][k], rmq[y - (1 << k) + 1][k]);
printf ("%d\n", ans);
}
return 0;
}