Cod sursa(job #2722091)

Utilizator maraboneaMara Bonea marabonea Data 12 martie 2021 16:23:40
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
/**
*/
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax=1e5 + 5;
const int inf=1e9 + 5;
int n,m,t,a,b;
int v[nmax],ai[6*nmax];
void create(int st,int dr,int nod)
{
    if(st==dr)
    {
        ai[nod]=v[st];
        return;
    }
    int mid=(st+dr)>>1;
    int stnou=2*nod;
    int drnou=stnou +1;
    create(st,mid,stnou);
    create(mid+1,dr,drnou);
    ai[nod]=max(ai[stnou],ai[drnou]);
}
void update(int st,int dr,int a,int b,int nod)
{
    if(st==dr)
    {
        ai[nod]=b;
        return;
    }
    int mid=(st+dr)>>1;
    int stnou=2*nod;
    int drnou=stnou +1;
    if(a<=mid)
        update(st,mid,a,b,stnou);
    else
        update(mid+1,dr,a,b,drnou);
    ai[nod]=max(ai[stnou],ai[drnou]);
}
int maxim(int st,int dr,int a,int b,int nod)
{
   if(a<=st && b>=dr)
    {
        return ai[nod];
    }
    int sol=-inf;
    int mid=(st+dr)>>1;
    int stnou=2*nod;
    int drnou=stnou +1;
    if(a<=mid)
        sol=max(sol,maxim(st,mid,a,b,stnou));
    if(b>mid)
        sol=max(sol,maxim(mid+1,dr,a,b,drnou));
    return sol;
}
void read_solve()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    create(1,n,1);
    while(m)
    {
        fin>>t>>a>>b;
        if(t==1)
        {
            update(1,n,a,b,1);
        }
        if(t==0)
        {
            fout<<maxim(1,n,a,b,1)<<endl;
        }
        m--;
    }
}
int main()
{
    read_solve();
   return 0;
}