Mai intai trebuie sa te autentifici.
Cod sursa(job #1220635)
| Utilizator | Data | 17 august 2014 22:48:54 | |
|---|---|---|---|
| Problema | Range minimum query | Scor | 60 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 0.85 kb |
#include <stdio.h>
int rmq[100001][17];
int N, M;
int log2(int bits) {
return (bits & 0x80000000) ? 31 : log2((bits << 1) | 1) - 1;
}
int min(int x, int y) {
return x < y ? x : y;
}
int main() {
freopen("rmq.in", "rt", stdin);
freopen("rmq.out", "wt", stdout);
scanf("%d %d", &N, &M);
for (int i = 0; i < N; ++i) {
scanf("%d", &rmq[i][0]);
}
int log2n = log2(N) + 1;
for (int j = 1; j < log2n; ++j) {
for (int i = 0; i < N; ++i) {
rmq[i][j] = min(rmq[i][j-1], rmq[i + (1 << (j - 1))][j-1]);
}
}
for (int i = 0; i < M; ++i) {
int x, y;
scanf("%d %d", &x, &y);
x--;
y--;
int difflog = log2(y - x + 1);
int minimum = min(rmq[x][difflog], rmq[y - (1 << difflog) + 1][difflog]);
printf("%d\n", minimum);
}
return 0;
}
