Cod sursa(job #2586554)

Utilizator OvidRata Ovidiu Ovid Data 21 martie 2020 09:57:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
ifstream fin("arbint.in"); ofstream fout("arbint.out");


int n, m, a[100010], t[400010];
string s;


void build(int v, int tl, int tr){
int tm=(tl+tr)/2;

if(tl==tr){ t[v]=a[tm]; return;}

build(2*v, tl, tm);
build(2*v+1, tm+1, tr);
t[v]=max(t[2*v], t[2*v+1]);



}





void update(int v, int tl, int tr, int i, int x){
int tm=(tl+tr)/2;

if(tl>i || tr<i){return;}

if(tl==tr){  t[v]=x; a[tm]=x; return; }

update(2*v, tl, tm, i, x);
update(2*v+1, tm+1, tr, i, x);
t[v]=max(t[2*v], t[v*2+1]);



}




int get_max(int v, int tl, int tr, int l, int r){
int rez;
int tm=(tl+tr)/2;

if(l>r){return -1;}

if(l==tl && r==tr){
    return t[v];
}

rez=max(get_max(2*v, tl, tm, l, min(tm, r) ), get_max(2*v+1, tm+1, tr, max(l, tm+1), r ) );


return rez;
}











int main(){
fin>>n>>m;

for(int i=1; i<=n; i++){
    fin>>a[i];
}
build(1, 1, n);


for(;m;m--){
    int x;
    fin>>x;

    if(x==0){
        int u,v;
        fin>>u>>v;
        fout<<get_max(1, 1, n, u, v)<<"\n";
    }

    if(x==1){
        int u, v;
        fin>>u>>v;
        update(1, 1, n, u, v);
    }

}







return 0;
}