Pagini recente » Clasamentul arhivei educationale | Borderou de evaluare (job #2742015) | Clasamentul arhivei de probleme | Clasamentul arhivei de probleme | Cod sursa (job #1507999)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 100002
#define logn 18
using namespace std;
int n, m, i, j, d[logn][maxN], k[logn];
void read()
{
freopen("rmq.in", "r", stdin);
scanf("%d %d", &n, &m);
for (i = 1; i <= n; ++ i)
scanf("%d", &d[0][i]);
}
void solve()
{
for (j = 1; (1 << j) <= n; ++ j)
for (i = 1; i + (1 << j) - 1 <= n; ++ i)
d[j][i] = min(d[j - 1][i], d[j - 1][i + (1 << (j - 1))]);
j = 0;
for (i = 1; i <= n; ++ i)
{
if (i >= (1 << (j + 1)))
++ j;
k[i] = j;
}
}
void write()
{
int sol, x, y;
freopen("rmq.out", "w", stdout);
while (m --)
{
scanf("%d %d", &x, &y);
sol = min(d[k[y - x]][x], d[k[y - x]][1 + y - (1 << k[y - x])]);
printf("%d\n", sol);
}
}
int main()
{
read();
solve();
write();
return 0;
}