Pagini recente » Cod sursa (job #3217658) | Cod sursa (job #3294264) | Cod sursa (job #3287151) | Cod sursa (job #5313) | Cod sursa (job #3299975)
#include <iostream>
#pragma GCC optimize("O3,unroll-loops")
#define FILE_IN "rmq.in"
#define FILE_OUT "rmq.out"
#define BUFF_SIZE (1 << 20)
#define MAX_DIG_LEN 6
FILE *file_in, *file_out;
char buff[BUFF_SIZE], obuff[BUFF_SIZE], num_buff[MAX_DIG_LEN];
int pos = 0, opos = 0;
static inline void init_parsing() {
file_in = fopen(FILE_IN, "r");
file_out = fopen(FILE_OUT, "w");
fread(buff, 1, BUFF_SIZE, file_in);
}
static inline void finish_parsing() {
fwrite(obuff, 1, opos, file_out);
fclose(file_in);
fclose(file_out);
}
static inline void read_int(int &n) {
while (isspace(buff[pos])) {
pos++;
if (pos == BUFF_SIZE) {
fread(buff, 1, BUFF_SIZE, file_in);
pos = 0;
}
}
int nr = 0;
while (isdigit(buff[pos])) {
nr = nr * 10 + buff[pos++] - '0';
if (pos == BUFF_SIZE) {
fread(buff, 1, BUFF_SIZE, file_in);
pos = 0;
}
}
n = nr;
}
static inline void write_ch(char ch) {
obuff[opos++] = ch;
if (opos == BUFF_SIZE) {
fwrite(obuff, 1, BUFF_SIZE, file_out);
opos = 0;
}
}
static inline void write_int(int n) {
int idx = 0;
do {
num_buff[++idx] = n % 10 + '0';
n /= 10;
} while (n > 0);
while (idx)
write_ch(num_buff[idx--]);
}
const int NMAX = 1e5;
const int QMAX = 1e6;
const int LGMAX = 16;
int rmq[LGMAX + 1][NMAX + 1];
int lg2[NMAX + 1];
int main() {
init_parsing();
int n, q;
read_int(n);
read_int(q);
for (int i = 0; i < n; i++) {
read_int(rmq[0][i]);
}
for (int j = 1; j <= LGMAX; j++) {
for (int i = 0; i + (1 << j) - 1 < n; i++) {
rmq[j][i] = std::min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
}
}
for (int i = 2; i <= n; i++) {
lg2[i] = lg2[i >> 1] + 1;
}
for (int i = 0; i < q; i++) {
int l, r;
read_int(l);
read_int(r);
int k = lg2[r - l + 1];
write_int(std::min(rmq[k][l - 1], rmq[k][r - (1 << k)]));
write_ch('\n');
}
finish_parsing();
return 0;
}