Pagini recente » Cod sursa (job #1512404) | Cod sursa (job #1733591) | Cod sursa (job #1981625) | Cod sursa (job #2274327) | Cod sursa (job #1106384)
#include <cstdio>
#include <math.h>
#define MIN(a, b) ((a) > (b) ? (b) : (a))
const int NMAX = 100005;
const int LMAX = 18;
using namespace std;
int N, M, table[NMAX][LMAX];
int find(int a, int b) {
int x = (int) (log(b - a + 1) / log(2));
return MIN(table[a][x], table[b - (1 << x) + 1][x]);
}
void read() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%i%i", &N, &M);
for(int i = 1; i <= N; i++)
scanf("%d", &table[i][0]);
}
void solve() {
int a, b;
for(int i = 1; i <= M; i++) {
scanf("%i %i", &a, &b);
printf("%i\n", find(a, b));
}
}
void precompute() {
for(int step = 1, j = 1; step <= N; step <<= 1, j++) {
for(int i = 1; i <= N; i++)
if( i + step <= N)
table[i][j] = MIN(table[i][j-1], table[i + step][j - 1]);
else
table[i][j] = table[i][j-1];
}
}
int main() {
read();
precompute();
solve();
return 0;
}