Cod sursa(job #2825365)

Utilizator razvanboabesrazvan boabes razvanboabes Data 4 ianuarie 2022 16:57:18
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>

using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int v[100001],vmax,aint[200001];
void query(int nod,int left,int right,int ql,int qr) {
    int mid;
    mid=(left+right)/2;
    if(ql>=left and right<=qr)
        vmax=max(vmax,v[nod]);
     else{
        if(mid<=ql) // ma duc la dreapta
        query(nod*2+1,mid,right,ql,qr);
          if(mid>qr) // ma duc la stanga
        query(nod*2,left,mid,ql,qr);
     }
}
void maketree(int poz,int left, int right)
{
    if(left==right)
         aint[poz]=v[right];
    else{
        int med=(left+right)/2;

        maketree(poz*2,left,med);
        maketree(poz*2+1,med+1,right);
        aint[poz]=max(aint[poz*2],aint[poz*2+1]);
    }
}
void update(int poz,int left, int right, int target, int val)
{
    if(left==right)
         aint[poz]=v[right];
    else{
        int med=(left+right)/2;
        if(target<=med)
        update(poz*2,left,med,target,val);
        else
        update(poz*2+1,med+1,right,target,val);
        aint[poz]=max(aint[poz*2],aint[poz*2+1]);
    }
}
int main() {
    int n,m,i,t;
    cin>>n>>m;
    for(i=1; i<=n; i++) {
        cin>>v[i];
    }
    maketree(1,1,n);
    int c,a,b;
    for(t=1; t<=m; t++) {
        cin>>c>>a>>b;

        if(c==1) {
            update(1,1,n,a,b);
        }

        else if(c==0) {
            vmax=0;
            query(1,1,n,a,b);
            cout<<vmax<<'\n';
        }
    }
    return 0;
}