Cod sursa(job #3245284)

Utilizator susanSusan Ssssss susan Data 28 septembrie 2024 11:34:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <vector>
#include <functional>

using namespace std;


int main() {
    ifstream f("arbint.in");
    ofstream g("arbint.out");

    int n, m;
    f >> n >> m;

    vector<int> v(n + 1), aint((n + 1) * 4);
    for (int i = 1; i <= n; i++) {
        f >> v[i];
    }

    function<void(int, int, int)> build = [&](const int nod, const int st, const int dr) {
        if (st == dr) {
            aint[nod] = v[st];
            return;
        }

        const int mid = (st + dr) / 2;
        build(nod * 2, st, mid);
        build(nod * 2 + 1, mid + 1, dr);
        aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
    };

    function<void(int, int, int, int, int)> update = [&](const int pos, const int val, const int nod, const int st,
                                                         const int dr) {
        if (st == dr) {
            aint[nod] = val;
            return;
        }

        if (const int mid = (st + dr) / 2; pos <= mid) {
            update(pos, val, nod * 2, st, mid);
        } else {
            update(pos, val, nod * 2 + 1, mid + 1, dr);
        }

        aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
    };

    function<int(int, int, int, int, int)> query = [&](const int x, const int y, const int nod, const int st,
                                                       const int dr) {
        if (dr < x || y < st) return 0;
        if (x <= st && dr <= y) return aint[nod];

        const int mid = (st + dr) / 2;
        const int q_st = query(x, y, nod * 2, st, mid);
        const int q_dr = query(x, y, nod * 2 + 1, mid + 1, dr);
        return max(q_st, q_dr);
    };

    build(1, 1, n);
    while (m--) {
        int tip, a, b;
        f >> tip >> a >> b;
        if (tip == 0) g << query(a, b, 1, 1, n) << '\n';
        else update(a, b, 1, 1, n);
    }
}