Pagini recente » Cod sursa (job #2022312) | Cod sursa (job #246052) | Cod sursa (job #2041034) | Cod sursa (job #1766078) | Cod sursa (job #894079)
Cod sursa(job #894079)
// O(1) query using the RMQ data structure
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100001;
const int MAXLOG = 20;
int n;
int A[MAXN];
int rmq[MAXN][MAXLOG];
void preproc()
{
for (int i = 1; i <= n; ++i)
rmq[i][0] = A[i];
for (int j = 1; (1 << j) <= n; ++j)
for (int i = 1; i + (1 << j) <= n; ++i)
rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << j)][j - 1]);
}
int query(int x, int y)
{
int k = (int) (log(y - x + 1) / log(2));
return min(rmq[x][k], rmq[y - (1 << k) + 1][k]);
}
int main()
{
freopen("rmq3.in", "r", stdin);
freopen("rmq3.out", "w", stdout);
int m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &A[i]);
preproc();
for (int i = 0; i < m; ++i) {
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", query(x, y));
}
return 0;
}