Cod sursa(job #3324929)

Utilizator alecu2008Alecu Alexandru alecu2008 Data 24 noiembrie 2025 10:10:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

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



const int nmax=100001;
int aint[nmax*3],n,m,v[nmax];

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

}

inline void update(int st,int dr,int nod,int x,int y){
    if(st==x&&dr==x){
        aint[nod]=y;
    }
    else{
    int mij=(st+dr)>>1;
    if(x<=mij){
        update(st,mij,2*nod,x,y);
    }
    else{
        update(mij+1,dr,2*nod+1,x,y);
    }
    aint[nod]=max(aint[nod*2],aint[nod*2+1]);
    }
}

inline int query(int st,int dr,int a,int b,int nod){
    if(st==a&&dr==b){
        return aint[nod];
    }
    int mij=(st+dr)>>1;
    if(mij>=b)return query(st,mij,a,b,2*nod);
    else if(a>mij)return query(mij+1,dr,a,b,2*nod+1);
    else{
        return max(query(st,mij,a,mij,2*nod),query(mij+1,dr,mij+1,b,2*nod+1));
    }


}




int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>v[i];
    }
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int x,a,b;
        fin>>x;
        if(!x){
            fin>>a>>b;
            fout<<query(1,n,a,b,1)<<'\n';
        }
        else{
            fin>>a>>b;
            update(1,n,1,a,b);
        }
    }
}