Pagini recente » Cod sursa (job #1370423) | Cod sursa (job #1109579) | Cod sursa (job #1829819) | Cod sursa (job #827655) | Cod sursa (job #1940710)
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int BUF_SIZE = 1 << 17;
int n, nq, ptr;
int m[18][100005], v[100005], lg[100005];
char buffer[BUF_SIZE];
FILE * outFile;
void advance() {
ptr++;
if (ptr == BUF_SIZE) {
ptr = 0;
in.read(buffer, BUF_SIZE);
}
}
int read_int() {
int nr = 0;
while (!isdigit(buffer[ptr])) advance();
while (isdigit(buffer[ptr])) {
nr = nr * 10 + (buffer[ptr] - '0');
advance();
}
return nr;
}
void write_int(int nr) {
while(nr != 0) {
putc(nr % 10 + '0', outFile);
putc('\n', outFile);
nr /= 10;
}
}
void read() {
in.read(buffer, BUF_SIZE);
n = read_int();
nq = read_int();
for (int i = 1; i <= n; ++i) m[0][i] = read_int();
}
void logs() {
for (int i = 2; i <= n; ++i) {
lg[i] = lg[i / 2] + 1;
}
}
void preprocess_rmq() {
logs();
for (int j = 1; (1 << j) <= n; ++j) {
int val = n - (1 << j) + 1;
for (int i = 1; i <= val; ++i) {
m[j][i] = min(m[j-1][i], m[j-1][i + (1 << (j-1))]);
}
}
}
inline int rmq(int i, int j) {
return min(m[lg[j - i + 1]][i], m[lg[j - i + 1]][i + j - i + 1 - (1 << lg[j - i + 1])]);
}
int main() {
outFile = fopen("rmq.out","wt");
read();
preprocess_rmq();
for (int q = 1, i, j; q <= nq; ++q) {
i = read_int();
j = read_int();
write_int(rmq(i, j));
}
return 0;
}