Pagini recente » Cod sursa (job #545840) | Cod sursa (job #3285979) | Cod sursa (job #353441) | Cod sursa (job #2040210) | Cod sursa (job #2817740)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAXN 100000
#define LOGMAXN 17
int v[MAXN];
char logp[MAXN + 1];
int rmq[MAXN + 1][LOGMAXN];
void precalc_log(int n) {
int i;
logp[0] = logp[1] = 0;
for ( i = 2; i <= n; i++ ) {
logp[i] = logp[i / 2] + 1;
}
}
void build(int n) {
int i, i2;
for ( i = 0; i < n; i++ ) {
rmq[i][0] = v[i];
}
for ( i2 = 1; i2 <= logp[n]; i2++ ) {
for ( i = 0; i + (1 << i2) <= n; i++ ) {
rmq[i][i2] = min(rmq[i][i2 - 1], rmq[i + (1 << (i2 - 1))][i2 - 1]);
}
}
}
int calcAns(int first, int last) {
char logres;
logres = logp[last - first + 1];
return min(rmq[first][logres], rmq[last - (1 << logres) + 1][logres]);
}
int main() {
FILE *fin, *fout;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
int n, q, i, first, last;
fscanf(fin, "%d%d", &n, &q);
for ( i = 0; i < n; i++ ) {
fscanf(fin, "%d", &v[i]);
}
precalc_log(n);
build(n);
for ( i = 0; i < q; i++ ) {
fscanf(fin, "%d%d", &first, &last);
fprintf(fout, "%d\n", calcAns(--first, --last));
}
fclose(fin);
fclose(fout);
return 0;
}