Cod sursa(job #2665184)

Utilizator andrei.florea0405Florea Andrei-Bogdan andrei.florea0405 Data 30 octombrie 2020 11:50:23
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>


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

    std::vector<int> output;
    int block_size = sqrt(n);
    std::vector<int> blocks(block_size + 1, INT_MAX);

    int crt_block = -1;
    for (int i = 0; i < n; i++) {
        if (i % block_size == 0) {
            crt_block++;
        }
        blocks[crt_block] = std::min(blocks[crt_block], input[i]);
    }


    int left, right, crt_pos, ans;
    for (auto query: queries) {
        left = query.first;
        right = query.second;
        crt_pos = left;
        ans = INT_MAX;
        while (crt_pos < right && (crt_pos % block_size) != 0) {
            ans = std::min(ans, input[crt_pos]);
            crt_pos++;
        }

        while (crt_pos + block_size <= right) {
            ans = std::min(ans, blocks[crt_pos / block_size]);
            crt_pos += block_size;
        }

        while (crt_pos <= right) {
            ans = std::min(ans, input[crt_pos]);
            crt_pos++;
        }

        output.push_back(ans);
    }

    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;
}