Pagini recente » Cod sursa (job #1974569) | Cod sursa (job #2099071) | Cod sursa (job #2844898) | Cod sursa (job #1349849) | Cod sursa (job #1974842)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const int NMAX = 100005;
const int POWMAX = 32;
int min(int a, int b) {
if (a < b) {
return a;
} else {
return b;
}
}
void make_query_scheme(int numbers[NMAX], int n, int scheme[POWMAX][NMAX]) {
for (int i = 1; i <= n; ++i) {
scheme[0][i] = numbers[i];
}
for (int i = 1; (1 << i) <= n; ++i) {
for (int j = 1; j <= n - (1 << i) + 1; ++j) {
int l = 1 << (i - 1);
scheme[i][j] = min(scheme[i - 1][j], scheme[i - 1][j + l]);
}
}
}
void make_logmap(int logmap[NMAX], int n) {
logmap[1] = 0;
for (int i = 2; i <= n; ++i) {
logmap[i] = logmap[i / 2] + 1;
}
}
int main() {
FILE* input_file = fopen("rmq.in", "r");
FILE* output_file = fopen("rmq.out", "w");
int n = 0, m = 0;
fscanf(input_file, "%d", &n);
fscanf(input_file, "%d", &m);
int numbers[NMAX];
for (int i = 1; i <= n; ++i) {
fscanf(input_file, "%d", &numbers[i]);
}
int scheme[POWMAX][NMAX];
make_query_scheme(numbers, n, scheme);
int logmap[NMAX];
make_logmap(logmap, n);
for (int i = 0; i < m; ++i) {
int x = 0, y = 0;
fscanf(input_file, "%d", &x);
fscanf(input_file, "%d", &y);
int diff = y - x + 1;
int l = logmap[diff];
int sh = diff - (1 << l);
fprintf(output_file, "%d\n", min(scheme[l][x], scheme[l][x + sh]));
}
fclose(input_file);
fclose(output_file);
return 0;
}