Cod sursa(job #2669788)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 7 noiembrie 2020 22:54:57
Problema Range minimum query Scor 70
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

struct RMQ_t {
    int32_t *buffer;
    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;
    self->buffer = malloc(sizeof(int32_t) * self->size);
    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));
}

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);
    int32_t *buffer = malloc(sizeof(int32_t) * n);
    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));
    }
}