Cod sursa(job #3346338)

Utilizator CreditKing69Bogdan Moldovan CreditKing69 Data 13 martie 2026 11:31:46
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <fstream>

using namespace std;

const int MAXN = 100005;
const int MAXBLOCK = 320; // Aproximativ sqrt(100000)

int v[MAXN];
int b_min[MAXBLOCK];
int n, m, block_size;

void build() {
    block_size = sqrt(n);
    // Inițializăm minimele blocurilor cu o valoare foarte mare
    for (int i = 0; i < MAXBLOCK; i++) b_min[i] = 2e9;

    for (int i = 1; i <= n; i++) {
        int block_idx = i / block_size;
        b_min[block_idx] = min(b_min[block_idx], v[i]);
    }
}

int query(int l, int r) {
    int min_val = 2e9;
    int c_l = l / block_size;
    int c_r = r / block_size;

    if (c_l == c_r) {
        // Cazul în care intervalul este în același bloc
        for (int i = l; i <= r; i++)
            min_val = min(min_val, v[i]);
    }
    else {
        // Minimul din prima parte (bloc incomplet)
        for (int i = l, end = (c_l + 1) * block_size; i < end; i++)
            min_val = min(min_val, v[i]);

        // Minimul din blocurile complete intermediare
        for (int i = c_l + 1; i < c_r; i++)
            min_val = min(min_val, b_min[i]);

        // Minimul din ultima parte (bloc incomplet)
        for (int i = c_r * block_size; i <= r; i++)
            min_val = min(min_val, v[i]);
    }
    return min_val;
}

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");

	fin >> n >> m;

    for (int i = 1; i <= n; i++) fin >> v[i];

    build();

    while (m--) {
        int x, y;
        fin >> x >> y;
        fout << query(x, y) << "\n";
    }

    return 0;
}