Nu aveti permisiuni pentru a descarca fisierul grader_test11.ok
Cod sursa(job #1488767)
Utilizator | Data | 19 septembrie 2015 19:04:40 | |
---|---|---|---|
Problema | Range minimum query | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.05 kb |
#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;
}