Cod sursa(job #2254254)

Utilizator icansmileSmileSmile icansmile Data 4 octombrie 2018 22:11:56
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <malloc.h>

using namespace std;

int main() {
    int N, M;
    int number = 0;
    int *numbers;

    ifstream in("rmq.in");
    ofstream out("rmq.out");

    in >> N >> M;
    numbers = (int *)malloc(N * sizeof(int));

    for (int i = 0; i < N; i++) {
        in >> numbers[i];
    }

    int **l;
    l = (int **)calloc(N, sizeof(int*));
    for (int i = 0; i < N; i++) {
        l[i] = (int *)calloc(N, sizeof(int));
    }

    for (int i = 0; i < N; i++) {
        l[i][0] = i;
    }

    for (int j = 1; (1 << j) <= N; j++) {
        for (int i = 0; (i + (1 << j) - 1) < N ; i++) {
            if (numbers[l[i][j - 1]] < numbers[l[i + (1 << (j - 1))][j - 1]]) {
                l[i][j] = l[i][j - 1];
            } else {
                l[i][j] = l[i + (1 << (j - 1))][j - 1];
            }
        }
    }

    int left;
    int right;

    for (int i = 0; i < M; i++) {
        in >> left >> right;

        left--;
        right--;

        int j = (int)log2(right - left + 1);

        int first = numbers[l[left][j]];
        int second = numbers[l[right - (1 << j) + 1][j]];
        out << min(first, second) << endl;
    }

    in.close();
    out.close();

    free(numbers);
    for (int i = 0; i < N; i++) {
        free(l[i]);
    }
    free(l);
    
    return 0;
}