Pagini recente » Cod sursa (job #2288677) | Cod sursa (job #812687) | Cod sursa (job #1257179) | Cod sursa (job #2578505) | Cod sursa (job #290245)
Cod sursa(job #290245)
#include <stdio.h>
#define nm 100010
#define mm 18
int v[nm], log2[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 = log2[z];
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;
}
log2[1] = 0;
for (i=2; i<=n; ++i)
{
log2[i] = log2[i/2] + 1;
}
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;
}