Cod sursa(job #2649738)

Utilizator adiaioanaAdia R. adiaioana Data 16 septembrie 2020 09:09:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define NMAX 100100
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
//cu leizi
int N,aint[4*NMAX], lz[4*NMAX];

void propag(int nod)
{
    if(lz[nod])
    {
        lz[2*nod]=lz[2*nod+1]=lz[nod];
        aint[2*nod]=aint[2*nod+1]=lz[nod];
        lz[nod]=0;
    }
}

void update(int nod, int st, int dr, int L, int R, int val)
{
    if(L<=st && dr<=R)
    {
        aint[nod]=val;
        lz[nod]=val;
        return ;
    }
    propag(nod);
    int mid=(st+dr)/2;
    if(L<=mid) update(2*nod, st, mid, L,R,val);
    if(mid<R) update(2*nod+1,mid+1, dr, L,R,val);
    aint[nod]=max(aint[nod*2],aint[2*nod+1]);
}

int query(int nod, int st, int dr, int L, int R)
{
    if(L>dr || R<st)
        return 0;
    if(L<=st && dr<=R)
        return aint[nod];
    int mid=(st+dr)/2, ans=0;
    if(st<=mid) ans=max(ans, query(nod*2, st,mid, L,R));
    if(mid<dr) ans=max(ans, query(nod*2+1, mid+1, dr, L,R));
    return ans;
}

int main()
{
    int M,st,dr, op, val;
    cin>>N>>M;
    for(int i=1; i<=N; ++i)
    {
        cin>>val;
        update(1,1,N,i,i,val);
    }

    while(M--)
    {
        cin>>op>>st>>dr;
        if(op==1)
            update(1,1,N,st,st,dr);
        else
            cout<<query(1,1,N,st,dr)<<'\n';
    }
    return 0;
}