Cod sursa(job #3259766)

Utilizator AndreiDragosDavidDragos Andrei David AndreiDragosDavid Data 27 noiembrie 2024 19:24:07
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

int n, m;
const int MAXN = 100000;
int aint[4 * MAXN];

int query(int node, int start, int end, int l, int r) {
    if (l > end || r < start)
        return INT_MIN;

    if (l <= start && end <= r)
        return aint[node];

    int mid = (start + end) / 2;

    int leftMax = query(2 * node, start, mid, l, r);
    int rightMax = query(2 * node + 1, mid + 1, end, l, r);

    return max(leftMax, rightMax);
}

void update(int node, int start, int end, int idx, int val) {
    if(start == end)
        aint[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);

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

void build(vector<int>& arr, int node, int start, int end) {
    if (start == end)
        aint[node] = arr[start];
    else{
        int mid = (start + end) / 2;

        build(arr, 2 * node, start, mid);
        build(arr, 2 * node + 1, mid + 1, end);

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

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
#endif
    cin.tie(0)->sync_with_stdio(0);

    cin >> n >> m;
    vector<int> a(n);

    for (int i = 0; i < n; ++i)
        cin >> a[i];

    build(a, 1, 0, n-1);

    for(int i=0; i<m; ++i){
        int tip, aa, b;
        cin >> tip >> aa >> b;

        if(tip == 0)
            cout << query(1, 0, n-1, aa-1, b-1) << '\n';
        else
            update(1, 0, n-1, aa-1, b);
    }

    return 0;
}