Cod sursa(job #3002338)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 14 martie 2023 17:39:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;

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

const int dim=3e5+10;

class AINT{
    struct Nod{
        int val;
    };
    Nod aint[4*dim];
    Nod Merge(Nod n1,Nod n2){
        Nod n;
        n.val=max(n1.val,n2.val);
        return n;
    }
public:
    void Update(int nod,int tl,int tr,int pos,int val){
        if(tl==tr){
            aint[nod]={val};
            return;
        }
        int tm=(tl+tr)/2;
        if(pos<=tm){
            Update(2*nod,tl,tm,pos,val);
        }
        if(pos>tm){
            Update(2*nod+1,tm+1,tr,pos,val);
        }
        aint[nod]=Merge(aint[2*nod],aint[2*nod+1]);
    }
    Nod Query(int nod,int tl,int tr,int l,int r){
        if(tl==l&&tr==r){
            return aint[nod];
        }
        int tm=(tl+tr)/2;
        if(r<=tm){
            return Query(2*nod,tl,tm,l,r);
        }
        if(l>tm){
            return Query(2*nod+1,tm+1,tr,l,r);
        }
        return Merge(Query(2*nod,tl,tm,l,tm),Query(2*nod+1,tm+1,tr,tm+1,r));
    }
}aint;

signed main(){
    int n,m;
        fin>>n>>m;
    for(int i=1;i<=n;i++){
        int x;
        fin>>x;
        aint.Update(1,1,n,i,x);
    }
    while(m--){
        int op,l,r;
        fin>>op>>l>>r;
        if(op==1){
            aint.Update(1,1,n,l,r);
        }else{
            fout<<aint.Query(1,1,n,l,r).val<<'\n';
        }
    }
}