Pagini recente » Cod sursa (job #875400) | Cod sursa (job #768773) | Cod sursa (job #450611) | Cod sursa (job #3002413) | Cod sursa (job #1644510)
# include <cstdio>
using namespace std;
FILE *fin = fopen("rmq.in", "rt");
FILE *fout = fopen("rmq.out", "wt");
const int MAXN = 100005;
const int LOGN = 17;
int v[MAXN];
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", &v[i]);
rmq[0][i] = 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));
if (v[rmq[i-1][j]] < v[rmq[i-1][j+k]])
rmq[i][j] = rmq[i-1][j];
else
rmq[i][j] = rmq[i-1][j+k];
}
// k maxim a.i. 2^k < b-a
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 (v[rmq[k][a]] < v[rmq[k][j]])
fprintf(fout, "%d\n", v[rmq[k][a]]);
else
fprintf(fout, "%d\n", v[rmq[k][j]]);
}
return 0;
}