Cod sursa(job #2502574)

Utilizator Sho10Andrei Alexandru Sho10 Data 1 decembrie 2019 10:08:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb

#include <bits/stdc++.h> //JuniorMonster a.k.a Sho10
#define ll long long int
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define all(a) (a).begin(), (a).end()
#define sz size
#define f first
#define s second
#define pb push_back
#define er erase
#define in insert
#define mp make_pair
#define pi pair
#define rc(s) return cout<<s,0
#define endl '\n'
#define mod 1000000007
#define PI 3.14159265359
#define CODE_START  ios_base::sync_with_stdio();cin.tie();cout.tie();
using namespace std;
ll n,m,a[5000055],st,dr,fn,val,pos,mx,y,x,t,mid;
void Update(ll,ll,ll);
void Query(ll,ll,ll);
int32_t main(){
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
    cin>>x;
    pos=i;
    val=x;
    Update(1,1,n);
}
for(ll i=1;i<=m;i++){
        cin>>t>>x>>y;
if(t==0){
    mx=-1;
    st=x;
    fn=y;
    Query(1,1,n);
    cout<<mx<<endl;
}else {
pos=x;
val=y;
Update(1,1,n);
}
}
}
void Update(ll nod,ll left,ll right){
    if(left==right){
        a[nod]=val;
        return;
    }
    ll mid=(left+right)/2;
        if(pos<=mid){
            Update(2*nod,left,mid);
        }else Update(2*nod+1,mid+1,right);
        a[nod]=max(a[2*nod],a[2*nod+1]);
}
void Query(ll nod,ll left,ll right){
if(st<=left&&right<=fn){
    if(mx<a[nod]){
        mx=a[nod];
    }
    return;
}
ll mid=(left+right)/2;
if(st<=mid) Query(2*nod,left,mid);
if(mid<fn) Query(2*nod+1,mid+1,right);
}