Cod sursa(job #2502563)

Utilizator Sho10Andrei Alexandru Sho10 Data 1 decembrie 2019 09:04:50
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 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[400055],st,dr,fn,val,pos,mx,y,x,t,mid;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
void Update(ll,ll,ll);
void Query(ll,ll,ll);
int32_t main(){
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;
    }
    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;
        }
    }
    mid=(left+right)/2;
    if(st<=mid){
        Query(2*nod,left,mid);
    }else Query(2*nod+1,mid+1,right);
}