Pagini recente » Cod sursa (job #1660135) | Cod sursa (job #291876) | Cod sursa (job #2738656) | Cod sursa (job #677551) | Cod sursa (job #1356860)
#include <cstdio>
using namespace std;
const int nmax = 100001, logmax = 18;
int A[nmax], D[nmax][logmax], N, Q, loga2[nmax];
void build() {
loga2[1] = 0;
for (int i = 2; i <= N; i++)
loga2[i] = loga2[i / 2] + 1;
for (int i = 0; i < N; i++)
D[i][0] = i;
for (int j = 1; (1 << j) <= N; j++)
for (int i = 0; i + (1 << j) - 1 < N; i++)
if (A[D[i][j - 1]] < A[D[i + (1 << (j - 1))][j - 1]]) D[i][j] = D[i][j - 1];
else D[i][j] = D[i + (1 << (j - 1))][j - 1];
}
int query(int i, int j) {
int k = loga2[j - i + 1];
if (A[D[i][k]] <= A[D[j - (1 << k) + 1][k]]) return D[i][k];
else return D[j - (1 << k) + 1][k];
}
int main () {
FILE *in = fopen("rmq.in", "r"), *out = fopen("rmq.out", "w");
if (in && out) {
fscanf(in, "%d %d\n", &N, &Q);
for (int i = 0; i < N; i++)
fscanf(in, "%d\n", A + i);
build();
int x, y;
for (int i = 0; i < Q; i++) {
fscanf(in, "%d %d\n", &x, &y);
fprintf(out, "%d\n", A[query(x - 1, y - 1)]);
}
fclose(in);
fclose(out);
}
return 0;
}