Cod sursa(job #3254268)

Utilizator vladneaguvladCristianoRonaldo vladneagu Data 6 noiembrie 2024 20:33:04
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#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;
}