Cod sursa(job #3266768)

Utilizator heheboi6Budiul Alexandru Vasile heheboi6 Data 10 ianuarie 2025 11:36:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N[400001],T[100001];
void build(int nod, int st, int dr){
    if(st!=dr){
        int mij=(st+dr)/2;
        build(nod*2,st,mij);
        build(nod*2+1,mij+1,dr);
        N[nod]=max(N[nod*2],N[nod*2+1]);
    }
    else{
        N[nod]=T[st];
    }
}
void update(int val, int nod, int st, int dr, int poz){
    if(st!=dr){
        int mij=(st+dr)/2;
        if(poz<=mij){
            update(val,nod*2,st,mij,poz);
        }
        else{
            update(val,nod*2+1,mij+1,dr,poz);
        }
        N[nod]=max(N[nod*2],N[nod*2+1]);
    }
    else{
        N[nod]=val;
    }
}
int query(int nod, int stint, int drint, int st, int dr){
    int mij=(st+dr)/2,r1=0,r2=0;
    if(stint<=st&&drint>=dr){
        return N[nod];
    }
    else{
        if(stint<=mij){
            r1 = query(nod*2,stint,drint,st,mij);
        }
        if(drint>mij){
            r2 = query(nod*2+1,stint,drint,mij+1,dr);
        }
        return max(r1,r2);
    }
}
int main()
{
    int n,i,q,tip,poz,val,st,dr,mx=0;
    f >> n >> q;
    for(i=1;i<=n;i++){
        f >> T[i];
    }
    build(1,1,n);
    for(i=1;i<=q;i++){
        f >> tip;
        if(tip==1){
            f >> poz >> val;
            update(val,1,1,n,poz);
        }
        else{
            f >> st >> dr;
            g << query(1,st,dr,1,n) << '\n';
        }
    }
    return 0;
}