Cod sursa(job #3180523)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 5 decembrie 2023 14:32:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <cstdio>

using namespace std;
int vec[100005];
int arbint[400005];
void build(int v, int tl, int tr) {
    if (tl == tr) {
        arbint[v] = vec[tl];
    } else {
        int tm = (tl + tr) / 2;
        build(v*2, tl, tm);
        build(v*2+1, tm+1, tr);
        arbint[v] = max(arbint[v*2], arbint[v*2+1]);
    }
}
int maxim(int v, int tl, int tr, int l, int r) {
    if (l > r)
        return 0;
    if (l == tl && r == tr) {
        return arbint[v];
    }
    int tm = (tl + tr) / 2;
    return max(maxim(v*2, tl, tm, l, min(r, tm)), maxim(v*2+1, tm+1, tr, max(l, tm+1), r));
}
void update(int v, int tl, int tr, int pos, int new_val) {
    if (tl == tr) {
        arbint[v] = new_val;
    } else {
        int tm = (tl + tr) / 2;
        if (pos <= tm)
            update(v*2, tl, tm, pos, new_val);
        else
            update(v*2+1, tm+1, tr, pos, new_val);
        arbint[v] = max(arbint[v*2], arbint[v*2+1]);
    }
}
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out","w",stdout);
    cin.tie(0); cin.sync_with_stdio(false);
    cout.tie(0); cout.sync_with_stdio(false);
    int n, m;
    cin>>n>>m;
    for (int i=1; i<=n; i++) cin>>vec[i];
    build(1, 1, n);
    for (int i=1; i<=m; i++) {
        int c, a, b;
        cin>>c>>a>>b;
        if (c==0) {
            cout<<maxim(1, 1, n, a, b)<<'\n';
        }
        if (c==1) {
            update(1, 1, n, a, b);
        }
    }
    return 0;
}