Cod sursa(job #2823354)

Utilizator SeracovanuEdwardSeracovanu Edward SeracovanuEdward Data 28 decembrie 2021 11:31:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
#define in "arbint.in"
#define out "arbint.out"
using namespace std;
const int nmax=1e5;
int mx[4*nmax+50];
int start ,finish,val,pos,ans;
static void  update(int nod , int left ,int right ){
  if( left == right ){
    mx[nod]=val;
    return;
  }
  int mid=(left+right)/2;
  if(pos<=mid)update(2*nod,left,mid);
  else update(2*nod+1,mid+1,right);
  mx[nod]=max(mx[2*nod],mx[2*nod+1]);
}
static void query (int nod,int left ,int right)
{
  if(start<=left && right <= finish)
    {
      ans=max(ans,mx[nod]);
      return;
    }
  int mid=(left+right)/2;
  if(start<=mid)query(2*nod,left,mid);
  if(mid<finish) query(2*nod+1,mid+1,right);
}
int main()
{

  freopen(in,"r",stdin);
  freopen(out,"w",stdout);
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n ,m;
  cin>>n>>m;
  for(int i=1,x;i<=n;++i){
    cin>>x;
    pos=i,val=x;
    update(1,1,n);
  }
  for(int i=1,x,a,b;i<=m;++i){
    cin>>x>>a>>b;
    if(x==0){
        ans=-1;
        start=a,finish=b;
        query(1,1,n);
        cout<<ans<<"\n";
    }
    else {
        pos=a,val=b;
        update(1,1,n);
    }
  }
}