Cod sursa(job #2200726)

Utilizator shantih1Alex S Hill shantih1 Data 2 mai 2018 12:39:15
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

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

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

int makearb(int st,int dr)
{
    int 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;
}

int maxab(int nr,int st,int dr)
{
    int 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(int a,int b)
{
    int 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);   }
    }
}