Pagini recente » Cod sursa (job #2250713) | Cod sursa (job #2226756) | Cod sursa (job #505181) | Cod sursa (job #2302088) | Cod sursa (job #1644519)
# include <cstdio>
# define min(a, b) (a < b ? a : b)
using namespace std;
FILE *fin = fopen("rmq.in", "rt");
FILE *fout = fopen("rmq.out", "wt");
const int MAXN = 100005;
const int LOGN = 17;
int rmq[LOGN][MAXN];
int kmax[MAXN];
int n, m, a, b;
int i, j, k;
int main() {
fscanf(fin, "%d%d", &n, &m);
for (i=1; i<=n; ++i)
fscanf(fin, "%d", &rmq[0][i]);
// D[i][j] = minimul incepand cu pozitia j a primelor 2^i elemente
for (i=1; (1<<i)<=n; ++i)
for (j=1; j+(1<<i)-1<=n; ++j) {
k = (1<<(i-1));
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+k]);
}
// kmax[i] = k maxim a.i. 2^k <= i
kmax[2] = 1;
for (i=3; i<=n; ++i)
kmax[i] = 1 + kmax[i/2];
for (i=1; i<=m; ++i) {
fscanf(fin, "%d%d", &a, &b);
k = kmax[(b-a+1)];
j = b-(1<<k)+1;
if (rmq[k][a] < rmq[k][j])
fprintf(fout, "%d\n", rmq[k][a]);
else
fprintf(fout, "%d\n", rmq[k][j]);
}
return 0;
}