Pagini recente » Cod sursa (job #2079701) | Cod sursa (job #1761242) | Cod sursa (job #1854705) | Cod sursa (job #1996129) | Cod sursa (job #235749)
Cod sursa(job #235749)
#include <cstdio>
const int maxn = 100001;
const int maxlg = 18;
FILE *in = fopen("rmq.in","r"), *out = fopen("rmq.out","w");
int n, m;
int a[maxn], lg[maxn];
int rmq[maxn][maxlg];
void read()
{
fscanf(in, "%d %d", &n, &m);
for ( int i = 1; i <= n; ++i )
fscanf(in, "%d", &a[i]);
for ( int i = 2; i <= n; ++i )
lg[i] = lg[i >> 1] + 1;
}
inline int min(int x, int y)
{
return x < y ? x : y;
}
int main()
{
read();
for ( int i = 1; i <= n; ++i )
rmq[i][0] = a[i];
for ( int j = 1; (1 << j) <= n; ++j )
for ( int i = 1; i + (1 << (j - 1)) <= n; ++i )
{
int t = i + (1 << (j - 1));
rmq[i][j] = min(rmq[i][j - 1], rmq[t][j - 1]);
}
int x, y;
for ( int i = 1; i <= m; ++i )
{
fscanf(in, "%d %d", &x, &y);
int log = lg[y - x + 1];
int diff = y - (1 << log) + 1;
fprintf(out, "%d\n", min(rmq[x][log], rmq[diff][log]));
}
return 0;
}