Pagini recente » Cod sursa (job #992255) | Cod sursa (job #416596) | Cod sursa (job #1468263) | Cod sursa (job #1510230) | Cod sursa (job #2849807)
#include <stdio.h>
#include <stdint.h>
void read_uint32_t(FILE *__restrict stream, uint32_t *__restrict nr) {
uint8_t ch;
*nr = 0;
while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
*nr *= 10;
*nr += ch - '0';
}
if (ch == '\r') {
fgetc(stream);
}
}
uint32_t __inline__ min(uint32_t o1, uint32_t o2) {
return o1 < o2 ? o1 : o2;
}
uint32_t n, m;
uint32_t rmq[17][100001];
void build_rmq() {
int32_t i, j;
uint32_t cp = 0;
for(i = 1; i < 16; ++i) {
cp = 1 << (i-1);
for(j = cp; j < n; ++j) {
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j-cp]);
}
}
}
uint32_t l[100001];
void build_log() {
l[0] = 0;
l[1] = 0;
l[2] = 1;
uint32_t i;
for(i = 3; i <= n; ++i) {
l[i] = l[i>>1] + 1;
}
}
int main(void) {
{
FILE *__restrict in = fopen("rmq.in", "r");
FILE *__restrict out = fopen("rmq.out", "w");
read_uint32_t(in, &n);
read_uint32_t(in, &m);
int32_t i;
for(i = 0; i < n; ++i) {
read_uint32_t(in, rmq[0]+i);
}
build_rmq();
build_log();
uint32_t x, y;
uint32_t dif;
for(i = 0; i < m; ++i) {
read_uint32_t(in, &x);
--x;
read_uint32_t(in, &y);
--y;
dif = y - x + 1;
fprintf(out, "%u\n",
min(rmq[l[dif]][y],
rmq[l[dif]][x + (1 << l[dif]) - 1]));
}
fclose(out);
fclose(in);
}
return 0;
}