Cod sursa(job #3134183)

Utilizator Andrei20035Rusu Andrei Andrei20035 Data 28 mai 2023 18:03:48
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <vector>
#include <climits>

class AInt {
private:
    std::vector<int> tree;
    int n;

    void init(const std::vector<int>& arr, int st, int dr, int pos) {
        if (st == dr) {
            tree[pos] = arr[st];
            return;
        }
        int mid = st + (dr - st) / 2;
        init(arr, st, mid, 2 * pos + 1);
        init(arr, mid + 1, dr, 2 * (pos + 1));
        tree[pos] = std::min(tree[2 * pos + 1], tree[2 * (pos + 1)]);
    }

    int getMinRecursive(int ql, int qr, int st, int dr, int pos) {
        if (ql <= st && qr >= dr)
            return tree[pos];

        if (ql > dr || qr < st)
            return INT_MAX;

        int mid = st + (dr - st) / 2;
        return std::min(getMinRecursive(ql, qr, st, mid, 2 * pos + 1), getMinRecursive(ql, qr, mid + 1, dr, 2 * (pos + 1)));
    }

    void update(int x, int val, int st, int dr, int pos) {
        if (x < st || x > dr)
            return;
        if (st == dr) {
            tree[pos] = val;
            return;
        }
        int mid = st + (dr - st) / 2;
        update(x, val, st, mid, 2 * pos + 1);
        update(x, val, mid + 1, dr, 2 * pos + 2);
        tree[pos] = std::min(tree[2 * pos + 1], tree[2 * (pos + 1)]);
    }

public:
    AInt(const std::vector<int>& arr) {
        n = arr.size();
        tree.resize(4 * n);
        init(arr, 0, n - 1, 0);
    }

    void updateValue(int x, int val) {
        update(x, val, 0, n - 1, 0);
    }

    int getMin(int ql, int qr) {
        return getMinRecursive(ql, qr, 0, n - 1, 0);
    }
};

int main() {
    std::vector<int> arr;
    int n, m, x, y;
    std::cin >> n >> m;
    for (int i = 0; i < n; i++) {
        std::cin >> x;
        arr.push_back(x);
    }

    AInt aint(arr);

    for (int i = 0; i < m; i++) {
        std::cin >> x >> y;
        std::cout << aint.getMin(x - 1, y - 1) << "\n";
    }

    return 0;
}