Cod sursa(job #2936216)

Utilizator mihaistamatescuMihai Stamatescu mihaistamatescu Data 8 noiembrie 2022 12:19:26
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
using namespace std;
int constexpr nMax=100010;
int v[nMax], aint[nMax];
int n, m;

int queryInt(int nod, int st, int dr, int qSt, int qDr){
    if (st>=qSt&&dr<=qDr){
        return aint[nod];
    }
    int mid=(st+dr)/2;
    if (qDr<=mid){
        return queryInt(nod*2, st, mid, qSt, qDr);
    }
    if (mid+1<=qSt){
        return queryInt(nod*2+1, mid+1, dr, qSt, qDr);
    }
    return max(queryInt(nod*2, st, mid, qSt, qDr), queryInt(nod*2+1, mid+1, dr, qSt, qDr));
}
void updateInt(int nod, int st, int dr, int poz, int val){
    if (st==dr){
        aint[nod]=val;
        return;
    }
    int mid=(st+dr)/2;
    if (poz<=mid){
        updateInt(nod*2, st, mid, poz, val);
    }
    else{
        updateInt(nod*2+1, mid+1, dr, poz, val);
    }
    aint[nod]=max(aint[nod*2], aint[nod*2+1]);
}
void buildInt(int nod, int st, int dr){
    if (st==dr){
        aint[nod]=v[st];
        return;
    }
    int mid=(st+dr)/2;
    buildInt(nod*2, st, mid);
    buildInt(nod*2+1, mid+1, dr);
    aint[nod]=max(aint[nod*2], aint[nod*2+1]);
}
inline int query(int qSt, int qDr){return queryInt(1, 1, n, qSt, qDr);}
inline void update(int poz, int val){updateInt(1, 1, n, poz, val);}
inline void build(){buildInt(1, 1, n);}
int main () {
    ifstream fin ("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    for (int i=1;i<=n;i++){
        fin>>v[i];
    }
    build();
    for (int i=1;i<=m;i++){
        int c;
        fin>>c;
        if (!c){
            int st, dr;
            fin>>st>>dr;
            fout<<query(st, dr)<<"\n";
        }
        else{
            int poz, val;
            fin>>poz>>val;
            update(poz, val);
        }
    }
    return 0;
}