Cod sursa(job #2516166)

Utilizator OvidRata Ovidiu Ovid Data 30 decembrie 2019 15:36:26
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define sc second
#define ft first
ifstream fin("arbint.in"); ofstream fout("arbint.out");



int A[100010], N, M;
int a,b;
long long T[400010];


long long construct(int l, int r, int nod){
    
    if(r==l){T[nod]=A[r];}
    else{int mij=l+r; mij/=2;
        T[nod]=max(construct(l, mij, nod*2), construct(mij+1, r, 2*nod+1) );}

     return T[nod];
} 




long long maximum(int n, int al, int ar, int l, int r){
    if(l>r){return 0;}
    
    if(al==l && ar==r){return T[n];}
    
    int mij=ar+al; mij/=2;
    return max( maximum(2*n, al, mij, l, min(mij,r)), maximum(2*n+1, mij+1, ar, max(l, mij+1), r) );
}





void update(int n, int al, int ar, int p, int v){
    if(ar==al){T[n]=v;}
    else{
    int mij=ar+al; mij/=2;
    
    if(p<=mij){
        update(2*n, al, mij, p, v);
    }
    else{
        update(2*n+1, mij+1, ar, p, v);
    }
    T[n]=max(T[2*n], T[2*n+1]);
    }
    
}





int main() {
fin>>N>>M;

for(int i=1; i<=N; i++){
    fin>>A[i];
}

construct(1, N, 1);
bool o;
for(;M;M--){
fin>>o;
if(o){fin>>a>>b; update(1, 1, N, a, b);}
else{fin>>a>>b;
fout<<maximum(1, 1, N, a, b)<<"\n";
}

}


}