Cod sursa(job #2301129)

Utilizator LucianTLucian Trepteanu LucianT Data 12 decembrie 2018 18:02:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;

const int maxN=1e5+1;
const int INF=1<<30;

int n,q;

int v[maxN];
int aint[4*maxN];

void build(int nod,int st,int dr){
    if(st==dr){
        aint[nod]=v[st];
        return;
    }

    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 pos,int val){
    if(st==dr){
        aint[nod]=val;
        return;
    }

    int mij=(st+dr)/2;

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

int query(int nod,int st,int dr,int lef,int rig){
    if(lef<=st && dr<=rig){
        return aint[nod];
    }

    int res=0;
    int mij=(st+dr)/2;

    if(lef<=mij){
        res=max(res,query(2*nod,st,mij,lef,rig));
    }
    if(mij<rig){
        res=max(res,query(2*nod+1,mij+1,dr,lef,rig));
    }

    return res;

}

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

    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>v[i];
    }

    build(1,1,n);

    while(q--){
        int op;
        cin>>op;

        if(op==0){
            int lef,rig;
            cin>>lef>>rig;
            cout<<query(1,1,n,lef,rig)<<'\n';
        } else {
            int pos,val;
            cin>>pos>>val;
            update(1,1,n,pos,val);
        }
    }

    return 0;
}