Pagini recente » Cod sursa (job #282251) | Cod sursa (job #2866116) | Cod sursa (job #2625004) | Cod sursa (job #2603649) | Cod sursa (job #290258)
Cod sursa(job #290258)
#include <stdio.h>
#define nm 100002
#define mm 18
int v[nm];
int a[nm][mm];
int n, m, i, x, y, j, k;
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];
/*k = (1 << (j-1));
if (v[a[i][j-1]] < v[a[i + k][j-1]])
a[i][j] = a[i][j-1];
else
a[i][j] = a[i + k][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;
}