Cod sursa(job #3165680)

Utilizator surfstyle1234Dennis surfstyle1234 Data 6 noiembrie 2023 18:52:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5 + 7;
int n,m,t;
int a[NMAX], aint[NMAX*4];

void build(int b, int e, int i){
    if(b==e){
        aint[i]=a[b];
        return;
    }
    int mij = (b+e)/2;
    build(b,mij,2*i);
    build(mij+1,e,2*i+1);
    aint[i]=max(aint[2*i],aint[2*i+1]);
}

void update(int b, int e, int i, int j, int v){
    if(b==e){
        aint[i]=v;
        return;
    }
    int mij = (b+e)/2;
    if(j<=mij)
        update(b,mij,2*i,j,v);
    else
        update(mij+1,e,2*i+1,j,v);
    aint[i]=max(aint[2*i],aint[2*i+1]);
}

int query(int b, int e, int i, int l, int r){
    if(l<=b&&e<=r){
        return aint[i];
    }
    int mij = (b+e)/2;
    if(r<=mij){
        return query(b,mij,2*i,l,r);
    }else if(l>=mij+1){
        return query(mij+1,e,2*i+1,l,r);
    }
    return max(query(b,mij,2*i,l,r),query(mij+1,e,2*i+1,l,r));
}

main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    int a,b;
    while(m--){
        cin>>t;
        if(t==0){
            cin>>a>>b;
            cout<<query(1,n,1,a,b)<<'\n';
        }else{
            cin>>a>>b;
            update(1,n,1,a,b);
        }
    }

}