Pagini recente » Cod sursa (job #2460575) | Cod sursa (job #1834282) | Cod sursa (job #1358009) | Cod sursa (job #1712986) | Cod sursa (job #2179673)
#include <stdio.h>
#define MAXN 100005
#define LOGMAXN 18
int A[MAXN];
int Q[MAXN][LOGMAXN];
void preprocess(int Q[MAXN][LOGMAXN], int A[MAXN], int N) {
int i, j;
for (i = 1; i <= N; i++) {
Q[i][0] = i;
}
for (j = 1; 1 << j <= N; j++) {
for (i = 1; i + (1 << j) - 1 <= N; i++) {
if (A[Q[i][j - 1]] < A[Q[i + (1 << (j - 1))][j - 1]]) {
Q[i][j] = Q[i][j - 1];
} else {
Q[i][j] = Q[i + (1 << (j - 1))][j - 1];
}
}
}
}
int main() {
int i, N, M, x, y, k;
FILE *in = fopen("rmq.in", "r");
FILE *out = fopen("rmq.out", "w");
fscanf(in, "%d %d", &N, &M);
for (i = 1; i <= N; i++) {
fscanf(in, "%d", &A[i]);
}
preprocess(Q, A, N);
for (i = 0; i < M; i++) {
fscanf(in, "%d %d", &x, &y);
for (k = 0; 1 << k <= y - x + 1; k++);
k--;
if (A[Q[x][k]] < A[Q[y - (1 << k) + 1][k]]) {
fprintf(out, "%d\n", A[Q[x][k]]);
} else {
fprintf(out, "%d\n", A[Q[y - (1 << k) + 1][k]]);
}
}
fclose(in);
fclose(out);
return 0;
}