Cod sursa(job #2974465)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 4 februarie 2023 09:41:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
#if 1
#define cin fin
#define cout fout
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#endif // 1
const int nmx = 1e5 + 5;
int a[nmx];
int t[nmx*4];
void create(int idx,int st,int dr){
    if(st == dr){
        t[idx] = a[st];
    }
    else{
        int md = (st + dr)/2;
        create(idx*2,st,md);
        create(idx*2+1,md+1,dr);
        t[idx] = max(t[idx*2],t[idx*2+1]);
    }
}

int q(int idx,int st,int dr,int a,int b){
    if(a>b)
        return 0;
    if(st == a && dr == b){
        return t[idx];
    }
    else {
        int md = (st + dr)/2;
        return max(q(idx*2,st,md,a,min(b,md)),
            q(idx*2+1,md+1,dr,max(a,md+1),b));
    }
}

void update(int idx,int st,int dr,int p,int nv){
    if(st == dr){
        t[idx] = nv;
    }
    else{
        int md = (st + dr)/2;
        if(p <= md)
            update(idx*2,st,md,p,nv);
        else
            update(idx*2+1,md+1,dr,p,nv);
        t[idx] = max(t[idx*2],t[idx*2+1]);
    }
}
int main(){
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    create(1,1,n);
    while(m--){
        int op,x,y;
        cin >> op >> x >> y;
        if(op == 0){
            cout << q(1,1,n,x,y) << "\n";
        }
        else if(op == 1){
            update(1,1,n,x,y);
        }
    }
}