Cod sursa(job #2801939)

Utilizator PetstebPopa Petru Petsteb Data 17 noiembrie 2021 11:03:09
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>

using namespace std;

const int C = 4e5 + 1;
int aint[C];

void build_aint(int poz, int l, int r){
    if(l == r){
        cin >> aint[poz];
        return;
    }

    int mij = (l + r) / 2;
    build_aint(poz * 2, l, mij);
    build_aint(poz * 2 + 1, mij + 1, r);
    aint[poz] = max(aint[poz * 2], aint[poz * 2 + 1]);
}

void change(int poz, int l, int r, int p, int val){
    if(l == r){
        aint[poz] = val;
        return;
    }

    int mij = (l + r) / 2;
    if(p <= mij)
        change(poz * 2, l, mij, p, val);
    else
        change(poz * 2 + 1, mij + 1, r, p, val);
    aint[poz] = max(aint[poz * 2], aint[poz * 2 + 1]);
}

int maxim(int poz, int l, int r, int a, int b){
    if(a > r || b < l)
        return 0;

    if(l >= a && r <= b)
        return aint[poz];

    int mij = (l + r) / 2;
    int max_l = maxim(2 * poz, l, mij, a, b);
    int max_r = maxim(2 * poz + 1, mij + 1, r, a, b);
    return max(max_l, max_r);
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n, q, a, b;
    bool qtype;
    cin >> n >> q;
    build_aint(1, 1, n);
    while(q--){
        cin >> qtype >> a >> b;
        if(qtype == 0){
            cout << maxim(1, 1, n, a, b) << '\n';
        }
        else{
            change(1, 1, n, a, b);
        }
    }
//    for(int i = 1; i <= 4 * n; i++)
//        cout << aint[i] << " ";
    return 0;
}