Cod sursa(job #2254249)

Utilizator icansmileSmileSmile icansmile Data 4 octombrie 2018 22:02:32
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

int main() {
    int N, M;
    int number = 0;
    vector<int> numbers;

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

    in >> N >> M;
    for (int i = 0; i < N; i++) {
        in >> number;
        numbers.push_back(number);
    }

    int l[N][N] = {{0}};

    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();

    return 0;
}