Cod sursa(job #1551958)

Utilizator SoniaFlorinaHorchidan Sonia-Florina SoniaFlorina Data 16 decembrie 2015 22:37:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#define tata(x) (x)/2
#define fiu_stg(x) (x)<<1
#define fiu_dr(x) ((x)<<1)+1


using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int arbint[4*100005], a[100005];
int n,m,op,li,ls;


void create_arbint(int poz, int stg, int dr)
{
    if(stg==dr)
    {
        arbint[poz]=a[stg];
        return;
    }
    int mij=(stg+dr)/2;
    create_arbint(fiu_stg(poz), stg, mij);
    create_arbint(fiu_dr(poz),mij+1,dr);
    arbint[poz]=max(arbint[fiu_stg(poz)], arbint[fiu_dr(poz)]);

}

void update(int poz, int stg, int dr, int vpoz, int val)
{
    if(stg==dr)
    {
        arbint[poz]=val;
        return;
    }
    int mij=(stg+dr)/2;
    if(vpoz>mij)
        update(fiu_dr(poz), mij+1, dr, vpoz, val);
    else
        update(fiu_stg(poz), stg, mij, vpoz, val);
    arbint[poz]=max(arbint[fiu_stg(poz)], arbint[fiu_dr(poz)]);
}

int query(int poz, int stg, int dr, int L, int R)
{
    if (stg>=L && dr<=R)
        return arbint[poz];
    int  Maxim=0;
    int mij=(stg+dr)/2;
    if(L<=mij)
        Maxim = max(Maxim, query(fiu_stg(poz), stg, mij, L, R));
    if (R>mij)
        Maxim=max(Maxim, query(fiu_dr(poz), mij+1, dr, L, R));
    return Maxim;
}

int main()
{
    in>>n>>m;
    int i;
    for(i=1;i<=n;i++)
        in>>a[i];
    create_arbint(1,1,n);
    for(i=1;i<=m;i++)
    {
        in>>op>>li>>ls;
        if(op)
            update(1,1,n,li,ls);
        else
            out<<query(1,1,n,li,ls)<<'\n';
    }
    in.close();
    out.close();

    return 0;
}