Cod sursa(job #2937965)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 11 noiembrie 2022 14:48:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,v[100001],k,t,p1,p2,arb[400005],cm=0;

void construire(int ind,int st,int dr)
{
    if(st==dr)
    {
        arb[ind]=v[st];


    }
    else
    {
        int mid=(st+dr)/2;
        construire(ind*2,st,mid);
        construire(ind*2+1,mid+1,dr);
        arb[ind]=max(arb[ind*2],arb[ind*2+1]);
    }
}
void cautare(int ind,int st,int dr,int p1,int p2)
{
    if(p1<=p2)
    {
        if(p1==st && dr<=p2)
        {

            cm=max(arb[ind],cm);
            cautare(1,1,n,dr+1,p2);

        }
        else
        {

            int mid=(st+dr)/2;

             if(p1>st)
            {
                if(mid+1>p1)
                {
                   cautare(ind*2,st,mid,p1,p2);
                }
                else
                     cautare(ind*2+1,mid+1,dr,p1,p2);
            }
            else if(dr>p2)
            {
                cautare(ind*2,st,mid,p1,p2);
            }






        }
    }

}
void actualizare(int ind,int st,int dr,int poz)
{
    if(st==dr)
    {
        arb[ind]=v[st];
    }
    else
    {
        int mid=(st+dr)/2;
        if(poz>=st && poz<=mid)
            actualizare(ind*2,st,mid,poz);
        else
            actualizare(ind*2+1,mid+1,dr,poz);
        arb[ind]=max(arb[ind*2],arb[ind*2+1]);
    }
}
int main()
{
    fin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i];

    }
    construire(1,1,n);


    for(int i=1;i<=k;i++)
    {
        fin>>t>>p1>>p2;

        if(t==0)
        {
           cm=0;
           cautare(1,1,n,p1,p2);
           fout<<cm<<"\n";
        }
        else
        {

            v[p1]=p2;
            actualizare(1,1,n,p1);
        }
    }


    return 0;
}