Pagini recente » Cod sursa (job #2580882) | Cod sursa (job #612679) | Cod sursa (job #1061962) | Cod sursa (job #3121582) | Cod sursa (job #2741961)
#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 n, m;
uint32_t a[100001];
uint32_t l2[100001];
uint32_t r[16][100001];
uint32_t min(uint32_t o1, uint32_t o2) {
return o1 < o2 ? o1 : o2;
}
uint32_t gmin(int32_t st, int32_t dr) {
uint32_t l = l2[dr - st + 1];
// fprintf(stdout, "%u - %u \n", r[l][st + (1 << l) - 1], r[l][dr]);
return min(r[l][st + (1 << l) - 1], r[l][dr]);
}
void pcalc() {
l2[1] = 0;
int32_t i, j;
for (i = 2; i <= n; ++i) {
l2[i] = 1 + l2[i >> 1];
}
for (i = 1; i <= l2[n]; ++i) {
for (j = 1; j <= n; ++j) {
if ((1 << (i-1)) <= j) {
r[i][j] = min(r[i - 1][j - (1 << (i - 1))], r[i - 1][j]);
}
}
}
}
int main() {
{
FILE *__restrict in = fopen("rmq.in", "r");
read_uint32_t(in, &n);
read_uint32_t(in, &m);
{
int32_t i;
for (i = 0; i < n; ++i) {
read_uint32_t(in, a + i);
r[0][i] = a[i];
}
}
pcalc();
{
FILE *__restrict out = fopen("rmq.out", "w");
int32_t i;
uint32_t st, dr;
for (i = 0; i < m; ++i) {
read_uint32_t(in, &st);
read_uint32_t(in, &dr);
fprintf(out, "%u\n", gmin(st-1, dr-1));
}
fclose(out);
}
fclose(in);
}
return 0;
}