Pagini recente » Cod sursa (job #102034) | Cod sursa (job #3307375) | Cod sursa (job #3341480) | Cod sursa (job #1863704) | Cod sursa (job #3346338)
#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;
}