Cod sursa(job #2208710)

Utilizator bigmixerVictor Purice bigmixer Data 31 mai 2018 00:23:17
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<bits/stdc++.h>
#define ll long long
#define sz size
#define pb push_back
#define er erase
#define in insert
#define fr first
#define sc second
#define mp make_pair
#define pi pair
#define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
#define rc(s) return cout<<s,0
using namespace std;


int m,n,a[100005],tree[400005],t,x,y,rip;

void createtree(int low,int high,int pos){
     if(low==high){
        tree[pos]=a[low];
        return ;
     }
     int mid=low+(high-low)/2;
     createtree(low,mid,2*pos+1);
     createtree(mid+1,high,2*pos+2);
     tree[pos]=max(tree[2*pos+1],tree[2*pos+2]);
}

void update(int x,int y,int low,int high,int pos){
        if(low==high){
            tree[pos]=y;
            return ;
        }
        int mid=low+(high-low)/2;
        if(x<=mid){
            update(x,y,low,mid,2*pos+1);
        }
        else{
            update(x,y,mid+1,high,2*pos+2);
        }
        tree[pos]=max(tree[2*pos+1],tree[2*pos+2]);

}
int rangemax(int low,int high,int low1,int high1,int pos){
       if(low>high1 || low1>high){
            return rip;
       }
       if(low1>=low && high1<=high ){
            return tree[pos];
       }
       int mid=low1+(high1-low1)/2;
       return max(rangemax(low,high,low1,mid,2*pos+1),rangemax(low,high,mid+1,high1,2*pos+2));

}


signed main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
      cin >> n >> m;
      for(int i=1;i<=n;i++) cin >> a[i];
      createtree(1,n,0);
      while(m--){
          cin >> t >> x >> y;
          if(t==0){
                cout<<rangemax(x,y,1,n,0)<<endl;
          }
          else{
                update(x,y,1,n,0);
          }
      }

}