Cod sursa(job #3333148)

Utilizator lucaje123Vartolomei Luca lucaje123 Data 11 ianuarie 2026 14:29:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <algorithm>
#include <math.h>
#include <cstring>
using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int m, n, aint[400005], v[100005];

void build(int nod, int st, int dr){
    if(st==dr){
        aint[nod]=v[st];
    }
    else{
        int mij=(st+dr)/2;
        build(2*nod, st, mij);
        build(2*nod+1, mij+1, dr);
        aint[nod]=max(aint[2*nod], aint[2*nod+1]);
    }
}

void update(int nod, int st, int dr, int poz, int val){
    if(st==dr){
        aint[nod]=val;
    }
    else{
        int mij=(st+dr)/2;
        if(poz<=mij){
            update(2*nod, st, mij, poz, val);
        }
        else{
            update(2*nod+1, mij+1, dr, poz, val);
        }
        aint[nod]=max(aint[2*nod], aint[2*nod+1]);
    }
}

int query(int nod, int st, int dr, int ql, int qr){
    if(ql<=st&&dr<=qr){
        return aint[nod];
    }
    int mij=(st+dr)/2, val1=0, val2=0;
    if(ql<=mij)val1=query(2*nod, st, mij, ql, qr);
    if(mij+1<=qr)val2=query(2*nod+1, mij+1, dr, ql, qr);
    return max(val1, val2);
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i];
    }
    build(1, 1, n);
    for(int i=1;i<=m;i++){
        int t, a, b;
        cin>>t>>a>>b;
        if(t==0){
            cout<<query(1, 1, n, a, b)<<'\n';
        }
        else{
            update(1, 1, n, a, b);
        }
    }
}