Pagini recente » Cod sursa (job #1740682) | Cod sursa (job #2755953) | Cod sursa (job #684626) | Cod sursa (job #1111689) | Cod sursa (job #1797242)
#include <cstdio>
using namespace std;
const int NMAX = 100000;
const int LGMAX = 16;
int rmq[LGMAX + 2][NMAX + 5];
int lg[NMAX + 5];
int minim(int a, int b)
{
if (a < b)
return a;
return b;
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m, st, dr, mid;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &rmq[0][i]);
for (int i = 1, k = 0; i <= n; ++i)
{
if (i >= (2 << k))
++k;
lg[i] = k;
}
for (int i = 1; i <= lg[n]; ++i)
for (int j = 1; j <= n; ++j)
if ((1 << i) <= j)
rmq[i][j] = minim(rmq[i - 1][j], rmq[i - 1][j - (1 << (i - 1))]);
for (int i = 1; i <= m; ++i)
{
scanf("%d %d", &st, &dr);
mid = lg[dr - st + 1];
printf("%d\n", minim(rmq[mid][dr], rmq[mid][st + (1 << mid) - 1]));
}
return 0;
}