Cod sursa(job #3357800)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 15:03:11
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <cmath>
#include <algorithm>

int main() {
    std::ifstream input("rmq.in");
    std::ofstream output("rmq.out");

    int n, m;
    input >> n >> m;

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

    int blockSize = static_cast<int>(std::sqrt(n));
    if (blockSize * blockSize < n) blockSize++;

    int numBlocks = (n + blockSize - 1) / blockSize;
    int* blockMin = new int[numBlocks];

    for (int i = 0; i < numBlocks; ++i) {
        blockMin[i] = INT_MAX;
        int start = i * blockSize;
        int end = std::min(start + blockSize, n);
        for (int j = start; j < end; ++j) {
            blockMin[i] = std::min(blockMin[i], a[j]);
        }
    }

    while (m--) {
        int x, y;
        input >> x >> y;
        x--; y--;

        int startBlock = x / blockSize;
        int endBlock = y / blockSize;
        int minVal = INT_MAX;

        if (startBlock == endBlock) {
            for (int i = x; i <= y; ++i) {
                minVal = std::min(minVal, a[i]);
            }
        } else {
            for (int i = x; i < (startBlock + 1) * blockSize; ++i) {
                minVal = std::min(minVal, a[i]);
            }
            for (int i = startBlock + 1; i < endBlock; ++i) {
                minVal = std::min(minVal, blockMin[i]);
            }
            for (int i = endBlock * blockSize; i <= y; ++i) {
                minVal = std::min(minVal, a[i]);
            }
        }

        output << minVal << '\n';
    }

    delete[] a;
    delete[] blockMin;
    return 0;
}