Pagini recente » Cod sursa (job #2493522) | Cod sursa (job #1100191) | Cod sursa (job #1873762) | Cod sursa (job #887794) | Cod sursa (job #288195)
Cod sursa(job #288195)
#include <cstdio>
#include <cmath>
const int NMAX = 100005;
int x[NMAX], N, M;
int rmq[34][NMAX];
inline int min(int a, int b)
{
return a < b ? a : b;
}
void input()
{
int i;
scanf("%d %d", &N, &M);
for (i = 1; i <= N; ++i)
scanf("%d", &x[i]);
}
void preprocess()
{
int i, j, n;
for (j = 1; j <= N - 1; ++j)
rmq[1][j] = min(x[j], x[j + 1]);
n = (int)log2(N);
for (i = 2; i <= n; ++i)
for (j = 1; j <= N - (1 << i) + 1; ++j)
rmq[i][j] = min( rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))] );
}
int query(int a, int b)
{
if (a == b) return x[a];
int k = (int)log2(b - a + 1);
return min(rmq[k][a], rmq[k][b - (1 << k) + 1]);
}
int main()
{
int m, a, b;
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
input();
preprocess();
for (m = 0; m != M; ++m) {
scanf("%d %d", &a, &b);
if (a > b) { a ^= b; b ^= a; a ^= b; }
printf("%d\n", query(a, b));
}
return 0;
}