Pagini recente » Cod sursa (job #139000) | Cod sursa (job #779341) | Cod sursa (job #548491) | Cod sursa (job #2164385) | Cod sursa (job #290266)
Cod sursa(job #290266)
#include <stdio.h>
#define nm 100010
#define mm 18
int v[nm];
int a[nm][mm];
int n, m, i, x, y, j;
inline int mn (int a, int b) { return (a < b ? a : b); }
int rmq(int x, int y)
{
int z = (y-x+1); int k = 0, p = 1; while (p <= z) { ++k; p *= 2; } --k;
return (mn ( v[a[x][k]], v[a[y-(1 << k)+1][k]] )); }
void read()
{ scanf("%d %d ", &n, &m);
for (i=1; i<=n; ++i)
{
scanf("%d ", &v[i]);
a[i][0] = i;
}
for (j=1; 1 << j <=n; ++j)
{
for (i=1; (i + (1 << j) - 1 <=n; ++i)
{ if (v[a[i][j-1]] < v[a[i + (1 << (j-1))][j-1]])
a[i][j] = a[i][j-1];
else
a[i][j] = a[i + (1 << (j-1))][j-1];
}
}
}
void solve()
{
for (i=1; i<=m; ++i)
{
scanf("%d %d ", &x, &y); printf("%d\n", rmq(x, y));
}
}
void write()
{ }
int main() { freopen("rmq.in", "r", stdin);
freopen("rmq.out","w",stdout); read(); solve(); write(); return 0; }