Cod sursa(job #2720148)

Utilizator mihaifluturFlutur Mihail mihaiflutur Data 10 martie 2021 17:11:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
using std::max;
const int inf=1e9+3, nmax=1e5;
int A[5+nmax],arb[5+4*nmax],n,m;
void read()
{
    fin>>n>>m;
    for(int i=0;i<n;i++)
        fin>>A[i];
}
void build_arb(int left,int right,int node)
{
    if(right==left)
    {
        arb[node]=A[right];
        return;
    }
    int next_node_left=2*node,next_node_right=next_node_left+1,mid=(left+right)>>1;
    build_arb(left,mid,next_node_left);
    build_arb(1+mid,right,next_node_right);
    arb[node]=max(arb[next_node_left],arb[next_node_right]);
}
void up_to_date_arb(int left,int right,int node,int ind,int val)
{
    if(right==left)
    {
        arb[node]=val;
        return;
    }
    int next_node_left=2*node,next_node_right=next_node_left+1,mid=(left+right)>>1;
    if(ind<=mid)
        up_to_date_arb(left,mid,next_node_left,ind,val);
    else
        up_to_date_arb(1+mid,right,next_node_right,ind,val);
    arb[node]=max(arb[next_node_left],arb[next_node_right]);
}
int max_arb(int left,int right,int node,int left_limit,int right_limit)
{
    if(left>=left_limit && right_limit>=right)
        return arb[node];
    int sol=-inf,next_node_left=2*node,next_node_right=next_node_left+1,mid=(left+right)>>1;
    if(left_limit<=mid)
        sol=max(sol,max_arb(left,mid,next_node_left,left_limit,right_limit));
    if(right_limit>mid)
        sol=max(sol,max_arb(1+mid,right,next_node_right,left_limit,right_limit));
   return sol;
}
void solve_and_print()
{
    build_arb(0,n-1,1);
    for(int i=0;i<m;i++)
    {
        int task,a,b;
        fin>>task>>a>>b;
        if(task)
            up_to_date_arb(1,n,1,a,b);
        else
            fout<<max_arb(1,n,1,a,b)<<'\n';
    }
}
int main()
{
    read();
    solve_and_print();
    return 0;
}