Cod sursa(job #3332519)

Utilizator coco11coraline kalbfleisch coco11 Data 7 ianuarie 2026 09:26:53
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>
using namespace std;

class SegmentTree {
private:
    int n;
    vector<long long> tree;

    void build(vector<long long>& arr, int node, int start, int end) {
        if (start == end) {
            tree[node] = arr[start];
        } else {
            int mid = (start + end) / 2;
            build(arr, 2 * node, start, mid);
            build(arr, 2 * node + 1, mid + 1, end);
            tree[node] = max(tree[2 * node], tree[2 * node + 1]);
        }
    }

    long long query(int node, int start, int end, int l, int r) {
        if (r < start || end < l) return LLONG_MIN;
        if (l <= start && end <= r) return tree[node];
        int mid = (start + end) / 2;
        long long left = query(2 * node, start, mid, l, r);
        long long right = query(2 * node + 1, mid + 1, end, l, r);
        return max(left, right);
    }

    void update(int node, int start, int end, int idx, long long val) {
        if (start == end) {
            tree[node] = val;
        } else {
            int mid = (start + end) / 2;
            if (idx <= mid) update(2 * node, start, mid, idx, val);
            else update(2 * node + 1, mid + 1, end, idx, val);
            tree[node] = max(tree[2 * node], tree[2 * node + 1]);
        }
    }

public:
    SegmentTree(vector<long long>& arr) {
        n = arr.size() - 1;
        tree.resize(4 * n);
        build(arr, 1, 1, n);
    }

    long long query(int l, int r) {
        return query(1, 1, n, l, r);
    }

    void update(int idx, long long val) {
        update(1, 1, n, idx, val);
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;
    vector<long long> A(N + 1);
    for (int i = 1; i <= N; i++) cin >> A[i];

    SegmentTree st(A);

    for (int i = 0; i < M; i++) {
        int type, a, b;
        cin >> type >> a >> b;
        if (type == 0) {
            cout << st.query(a, b) << "\n";
        } else {
            st.update(a, b);
        }
    }

    return 0;
}