Cod sursa(job #1974852)

Utilizator OwlreeRobert Badea Owlree Data 29 aprilie 2017 01:44:15
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const int NMAX = 1005;
const int POWMAX = 32;

int min(int a, int b) {
    if (a < b) {
        return a;
    } else {
        return b;
    }
}

void make_query_scheme(int* numbers, int n, int** scheme) {
    for (int i = 1; i <= n; ++i) {
        scheme[0][i] = numbers[i];
    }

    for (int i = 1; (1 << i) <= n; ++i) {
        for (int j = 1; j <= n - (1 << i) + 1; ++j) {
            int l = 1 << (i - 1);
            scheme[i][j] = min(scheme[i - 1][j], scheme[i - 1][j + l]);
        }
    }
}

void make_logmap(int* logmap, int n) {
    logmap[1] = 0;
    for (int i = 2; i <= n; ++i) {
        logmap[i] = logmap[i / 2] + 1; 
    }
}

int main() {

    FILE* input_file = fopen("rmq.in", "r");
    FILE* output_file = fopen("rmq.out", "w");

    int n = 0, m = 0;
    fscanf(input_file, "%d", &n);
    fscanf(input_file, "%d", &m);

    int* numbers = (int*)malloc((n + 10) * sizeof(int));

    for (int i = 1; i <= n; ++i) {
        fscanf(input_file, "%d", &numbers[i]);
    }

    int** scheme = (int**)malloc(POWMAX * sizeof(int*));
    for (int i = 0; i < POWMAX; ++i) {
        scheme[i] = (int*)malloc((n + 10) * sizeof(int));
    }

    make_query_scheme(numbers, n, scheme);

    int* logmap = (int*)malloc((n + 10) * sizeof(int));
    
    make_logmap(logmap, n);

    for (int i = 0; i < m; ++i) {
        int x = 0, y = 0;
        fscanf(input_file, "%d", &x);
        fscanf(input_file, "%d", &y);
        int diff = y - x + 1;
        int l = logmap[diff];
        int sh = diff - (1 << l);
        fprintf(output_file, "%d\n", min(scheme[l][x], scheme[l][x + sh]));
    }

    fclose(input_file);
    fclose(output_file);

    return 0;
}