Cod sursa(job #3330364)

Utilizator SkkippzzzDragomir Edy Skkippzzz Data 18 decembrie 2025 22:49:19
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>

using namespace std;
const int MAX=1e6;
int n,m,a[MAX+5],tree[4*MAX+5],i,l,r;
bool t;

void Buildtree(int tree[],int node,int left_now,int right_now){
    if(left_now==right_now){
        tree[node]=a[left_now];
    }
    else{
        int mid=(left_now+right_now)/2;
        Buildtree(tree,2*node,left_now,mid);
        Buildtree(tree,2*node+1,mid+1,right_now);
        tree[node]=max(tree[2*node],tree[2*node+1]);
    }
}
int Query(int node,int node_left,int node_right,int l,int r){
if(l>r){
    return 0;
}
if(l==node_left && r==node_right){
    return tree[node];
}
int mid=(node_left+node_right)/2;
return max(Query(2*node,node_left,mid,l,min(r,mid)),Query(2*node+1,mid+1,node_right,max(l,mid+1),r));
}

void Update(int node,int node_left,int node_right,int pos,int val){
if(node_left==node_right){
    tree[node]=val;
}
else{
    int mid=(node_right+node_left)/2;
    if(pos<=mid){
        Update(2*node,node_left,mid,pos,val);
    }
    else{
        Update(2*node+1,mid+1,node_right,pos,val);
    }
    tree[node]=max(tree[2*node],tree[2*node+1]);
}
}




int main()
{
    cin>>n>>m;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    Buildtree(tree,1,1,n);
    while(m--){
        cin>>t>>l>>r;
        /*tip 0*/if(!t){
            cout<<Query(1,1,n,l,r)<<"\n";
        }
        /*tip 1*/else{
            Update(1,1,n,l,r);
        }


    }
}