Pagini recente » Cod sursa (job #2416282) | Cod sursa (job #2598472) | Cod sursa (job #3198858) | Cod sursa (job #372199) | Cod sursa (job #3254268)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define LLONG_MAX 1e7
#define int long long
int seg_tree_size, base_size;
vector<long long> segment_tree;
void init(const vector<int>& a) {
int arr_size = a.size();
base_size = 1;
while (base_size < arr_size) base_size *= 2;
seg_tree_size = base_size * 2 - 1;
segment_tree.resize(seg_tree_size, LLONG_MAX);
for (int i = base_size - 1, j = 0; j < arr_size; i++, j++) {
segment_tree[i] = a[j];
}
for (int i = base_size - 2; i >= 0; i--) {
segment_tree[i] = min(segment_tree[i * 2 + 1], segment_tree[i * 2 + 2]);
}
}
void update(int i, int v) {
i += base_size - 1;
segment_tree[i] = v;
while (i > 0) {
i = (i - 1) / 2;
segment_tree[i] = min(segment_tree[i * 2 + 1], segment_tree[i * 2 + 2]);
}
}
long long min_query(int L, int R, int sl = 0, int sr = base_size, int i = 0) {
if (sl >= R || sr <= L) return LLONG_MAX;
if (sl >= L && sr <= R) return segment_tree[i];
int mid = (sl + sr) / 2;
return min(min_query(L, R, sl, mid, i * 2 + 1), min_query(L, R, mid, sr, i * 2 + 2));
}
signed main() {
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, q;
cin >> n >> q;
vector<int> arr(n);
for (auto& e : arr) cin >> e;
init(arr);
for (int i = 0; i < q; i++) {
int lll, rrr;
cin >> lll >> rrr;
cout << min_query(lll - 1, rrr) << endl;
}
return 0;
}