Cod sursa(job #2665503)

Utilizator andrei.florea0405Florea Andrei-Bogdan andrei.florea0405 Data 30 octombrie 2020 22:39:24
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

std::vector<int> precompute_log(int n)
{
    std::vector<int> computed_log(n + 1);
    computed_log[1] = 0;
    for (int i = 2; i <= n; i++)
        computed_log[i] = computed_log[i / 2] + 1;

    return computed_log;
}


std::vector<int> rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
    int n = input.size();
    int m = queries.size();

    int cols = ceil(log2(n)) + 1;
    std::vector< std::vector<int> > sparse_table(n, std::vector<int>(cols));
    std::vector<int> computed_log = precompute_log(n);
    std::vector<int> output(m);

    for (int i = 0; i < n; i++)
        sparse_table[i][0] = input[i];

    for (int j = 1; j < cols; j++)
        for (int i = 0; i + (1 << j) <= n; i++)
            sparse_table[i][j] = std::min(sparse_table[i][j - 1],
                                     sparse_table[i + (1 << (j - 1))][j - 1]);

    for (int i = 0; i < m; i++) {
        int left = queries[i].first, right = queries[i].second;
        int j = computed_log[right - left + 1];
        int minimum = std::min(sparse_table[left][j], sparse_table[right - (1 << j) + 1][j]);
        output[i] = minimum;
    }

    return output;
}

int main() {
    int n, m;
    std::ios::sync_with_stdio(0), std::cin.tie(0);
    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");

    fin >> n >> m;
    std::vector<int> a(n);

    for (int i = 0; i < n; i++) {
        fin >> a[i];
    }

    int l, r;
    std::vector< std::pair<int, int> > queries;
    for (int i = 0; i < m; i++) {
        fin >> l >> r;
        l--; r--;
        queries.push_back(std::make_pair(l, r));
    }

    std::vector<int> output;
    output = rmq(a, queries);

    for (int i = 0; i < m; i++)
        fout << output[i] << "\n";

    fin.close();
    fout.close();
    return 0;
}