Cod sursa(job #3166225)

Utilizator lolismekAlex Jerpelea lolismek Data 7 noiembrie 2023 21:55:56
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>

using namespace std;

#ifdef LOCAL
#else
    #define cin fin
    #define cout fout
#endif // LOCAL

ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int NMAX = 1e5;

int v[NMAX + 1];
int aint[4 * NMAX + 1];

void build(int node, int l, int r){
    if(l == r){
        aint[node] = v[l];
        return;
    }
    int mid = (l + r) / 2;
    build(2 * node, l, mid);
    build(2 * node + 1, mid + 1, r);
    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}

void update(int node, int l, int r, int pos, int val){
    if(l == r){
        aint[node] = val;
        return;
    }

    int mid = (l + r) / 2;
    if(pos <= mid){
        update(2 * node, l, mid, pos, val);
    }else{
        update(2 * node + 1, mid + 1, r, pos, val);
    }
    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}

int query(int node, int l, int r, int ql, int qr){
    if(ql <= l && r <= qr){
        return aint[node];
    }
    int mid = (l + r) / 2, ans = 0;
    if(ql <= mid){
        ans = max(ans, query(2 * node, l, mid, ql, qr));
    }
    if(mid + 1 <= qr){
        ans = max(ans, query(2 * node + 1, mid + 1, r, ql, qr));
    }
    return ans;
}

int main(){

    int n, m;
    cin >> n >> m;

    for(int i = 1; i <= n; i++){
        cin >> v[i];
    }

    build(1, 1, n);

    while(m--){
        int x, a, b;
        cin >> x >> a >> b;
        if(x == 0){
            cout << query(1, 1, n, a, b) << '\n';
        }else{
            update(1, 1, n, a, b);
        }
    }

    return 0;
}