Cod sursa(job #2435392)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 3 iulie 2019 21:00:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
//Arbori de intervale
#include<iostream>
#include<fstream>
#define nmax 100001

int n,m,ans;
int Arb[4*nmax],x[nmax];

void ConstrArb(int nod,int st,int dr,int a,int b,int val)
{
    int mij=(st+dr)/2;
    if(a<=st && dr<=b)
    {
        if(st==dr)
            {Arb[nod]=val;
            return;
            }
        else //[st,dr] e inclus in a[b]
        Arb[nod]=std::max(Arb[2*nod],Arb[2*nod+1]);

    }
    else
    {
        if(a<=mij)
            ConstrArb(nod*2,st,mij,a,b,val);
        if(b>mij)
            ConstrArb(nod*2+1,mij+1,dr,a,b,val);
        Arb[nod]=std::max(Arb[2*nod],Arb[2*nod+1]);

    }


}

void query(int nod,int st,int dr,int a,int b)
{
    int mij=(st+dr)/2;
    if(a<=st && dr<=b)
    {
        ans=std::max(ans,Arb[nod]);

    }
    else
    {
        if(a<=mij)
            query(nod*2,st,mij,a,b);
        if(b>mij)
            query(nod*2+1,mij+1,dr,a,b);
        //ans=std::max(ans,std::max(Arb[2*nod],Arb[2*nod+1]));

    }


}


int main()
{
    int i,c,a,b;
    std::ifstream fin("arbint.in");
    std::ofstream fout("arbint.out");
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x[i];
        ConstrArb(1,1,n,i,i,x[i]);
        //O(n log n)
    }
    for(i=1;i<=m;i++)
    {
        fin>>c;
            if(c)
            {
                fin>>a>>b;
                ConstrArb(1,1,n,a,a,b);

            }
            else
            {
                fin>>a>>b;
                ans=0;
                query(1,1,n,a,b);
                fout<<ans<<'\n';

            }
            //O(m log n)
    }

}