Pagini recente » Cod sursa (job #134774) | Cod sursa (job #2670612) | Cod sursa (job #2617750) | Cod sursa (job #1949495) | Cod sursa (job #2669784)
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
struct RMQ_t {
int32_t buffer[400004];
int32_t size;
};
typedef struct RMQ_t* RMQ;
int32_t min(int32_t a, int32_t b) {
return a < b ? a : b;
}
RMQ rm_Init(int32_t *buffer, int32_t size) {
RMQ self = malloc(sizeof(struct RMQ_t));
int32_t totalSize = 1;
while((totalSize <<= 1) < size);
self->size = totalSize << 1;
memset(self->buffer, 125, sizeof(int32_t) * self->size);
memcpy(self->buffer, buffer, sizeof(int32_t) * size);
for(int32_t i = 0; i < self->size - 2; i += 2) {
self->buffer[(i >> 1) + (self->size >> 1)] = min(self->buffer[i], self->buffer[i + 1]);
}
return self;
}
int32_t rm_Query(RMQ self, int32_t l, int32_t r) {
if(l >= r) {
return self->buffer[r];
}
int32_t cl1 = l;
int32_t offset = 1;
int32_t index = (self->size >> 1) - (l >> 1);
int32_t sumOffset = l;
while(!(cl1 & 1) && l + (offset << 1) < r) {
sumOffset += index;
cl1 >>= 1;
offset <<= 1;
index >>= 1;
}
return min(self->buffer[sumOffset], rm_Query(self, l + offset, r));
}
int32_t buffer[100003];
int main() {
FILE *fd = fopen("rmq.in", "r+");
FILE *fr = fopen("rmq.out", "w+");
int32_t n, m, a, b;
fscanf(fd, "%d %d", &n, &m);
for(int32_t i = 0; i < n; i++) {
fscanf(fd, "%d", &buffer[i]);
}
RMQ self = rm_Init(buffer, n);
for(int32_t i = 0; i < m; i++) {
fscanf(fd, "%d %d", &a, &b);
fprintf(fr, "%d\n", rm_Query(self, a - 1, b - 1));
}
}