Cod sursa(job #2200732)

Utilizator shantih1Alex S Hill shantih1 Data 2 mai 2018 12:42:37
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#define ll long long
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

ll nr,nra,n,m,o,v[100015],i,j,rc,pos[100015],a,b,li,lf,rm;

struct nod
{
    ll t,f1,f2,mx;
} p, arb[160000];

ll makearb(ll st,ll dr)
{
    ll md=st+(dr-st)/2, id=nr;
    if(st==dr)
    {
        arb[id].mx=v[st];
        pos[st]=nr;
    }
    else
    {
        nr++;
        arb[nr].t=id;
        arb[id].f1=nr;
        arb[id].mx=makearb(st,md);
        nr++;
        arb[nr].t=id;
        arb[id].f2=nr;
        arb[id].mx=max(arb[id].mx,makearb(md+1,dr));
    }
    return arb[id].mx;
}

ll maxab(ll nr,ll st,ll dr)
{
    ll md=st+(dr-st)/2,r=0;

    li=st;  lf=md;
    if(li>=a&&lf<=b)  r=arb[arb[nr].f1].mx;
    else if(max(li,a)<=min(lf,b))    r=maxab(arb[nr].f1,li,lf);

    li=md+1;lf=dr;
    if(li>=a&&lf<=b)  r=max(r,arb[arb[nr].f2].mx);
    else if(max(li,a)<=min(lf,b))    r=max(r,maxab(arb[nr].f2,li,lf));

    return r;
}

void update(ll a,ll b)
{
    ll nr=pos[a];
    arb[nr].mx=b;
    while(nr!=1)
    {
        nr=arb[nr].t;
        arb[nr].mx=max(arb[arb[nr].f1].mx,arb[arb[nr].f2].mx);
    }
}

int main() {

    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>v[i];

    nr=1;
    makearb(1,n);
    nra=nr;
    for(i=1;i<=m;i++)
    {
        fin>>o>>a>>b;
        if(o==0)
        {
            fout<<maxab(1,1,n)<<"\n";
        }
        if(o==1)    {   update(a,b);   }
    }
}