Pagini recente » Borderou de evaluare (job #559216) | Borderou de evaluare (job #2426837) | Borderou de evaluare (job #187626) | Borderou de evaluare (job #1424482) | Cod sursa (job #485243)
Cod sursa(job #485243)
#include <cstdio>
const int MAX_N = 100001;
const int MAX_P = 20;
int n, m;
int a[MAX_N][MAX_P];
int min(int a, int b) { return (a < b) ? a : b; }
int main()
{
int i, k, x, y;
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &n, &m);
int pow = 1, pt = 0;
for (; (pow << 1) <= n; pow <<= 1, ++pt);
for (k = 0, pow = 1; k <= pt; ++k, pow <<= 1)
for (i = 1; i <= n; ++i)
if (k == 0)
scanf("%d", &a[i][k]);
else
a[i][k] = min(a[i][k - 1], (i + (pow >> 1) <= n) ? a[i + (pow >> 1)][k - 1] : a[i][k - 1]);
for (i = 1; i <= m; ++i)
{
scanf("%d %d", &x, &y);
for (k = 0; 1 << (k + 1) <= (y - x); ++k);
printf("%d\n", min(a[x][k], a[y - (1 << k) + 1][k]));
}
}