Cod sursa(job #2971768)

Utilizator nicuhasCemartan Nicolae nicuhas Data 28 ianuarie 2023 00:14:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>
const int NMAX=1e5;
using namespace std;
int aint[4*NMAX],v[NMAX+1];
void constr(int p,int st,int dr){
    if(st==dr){
        aint[p]=v[st];
        return;
    }
    int m=(st+dr)/2,fs=2*p,fd=2*p+1;
    constr(fs,st,m);
    constr(fd,m+1,dr);
    aint[p]=max(aint[fs],aint[fd]);
}
void update(int p,int st,int dr,int poz,int val){
    if(st==dr){
        aint[p]=val;
        return;
    }
    int m=(st+dr)/2,fs=2*p,fd=2*p+1;
    if(poz<=m){
        update(fs,st,m,poz,val);
    }else{
        update(fd,m+1,dr,poz,val);
    }
    aint[p]=max(aint[fs],aint[fd]);
}
int interog(int p,int st,int dr,int a,int b){
    if(a<=st&&dr<=b){
        return aint[p];
    }
    int m=(st+dr)/2,fs=2*p,fd=2*p+1;
    int rezst=0,rezdr=0;
    if(a<=m){
        rezst=interog(fs,st,m,a,b);
    }
    if(m+1<=b){
        rezdr=interog(fd,m+1,dr,a,b);
    }
    return max(rezst,rezdr);
}
int main(){
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    int n,m,i,c,x,y;
    fin>>n>>m;
    for(i=1;i<=n;i++){
        fin>>v[i];
    }
    constr(1,1,n);
    for(i=1;i<=m;i++){
        fin>>c>>x>>y;
        if(c==0){
            fout<<interog(1,1,n,x,y)<<"\n";
        }
        else{
            update(1,1,n,x,y);
        }
    }
    return 0;
}