Cod sursa(job #2754515)

Utilizator IPCristianIlie Cristian IPCristian Data 25 mai 2021 23:06:46
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

int Arb[400010],V[100010];

void ArbInt(int Ind,int St,int Dr)
{
    if (St == Dr)
        Arb[Ind] = V[St];

    else
        {
            int Mij = (St+Dr)/2;

            ArbInt(Ind*2,St,Mij);
            ArbInt(Ind*2+1,Mij+1,Dr);

            if (Arb[Ind*2] > Arb[Ind*2+1])
                Arb[Ind] = Arb[Ind*2];
            else Arb[Ind] = Arb[Ind*2+1];
        }
}

int Maxi(int Ind,int St,int Dr,int MargInf,int MargSup)
{
    if (MargInf > MargSup)
        return -1;

    if (MargInf == St && MargSup == Dr)
        return Arb[Ind];

    int Mij = (St+Dr)/2;

    return max(Maxi(Ind*2,St,Mij,MargInf,min(MargSup,Mij)),Maxi(Ind*2+1,Mij+1,Dr,max(Mij+1,MargInf),MargSup));
}

void Schimb(int Ind,int St,int Dr,int Poz,int Val)
{
    if (St == Dr)
        Arb[Ind] = Val;

    else
        {
            int Mij = (St+Dr)/2;

            if (Poz <= Mij)
                Schimb(Ind*2,St,Mij,Poz,Val);
            else
                Schimb(Ind*2+1,Mij+1,Dr,Poz,Val);

            Arb[Ind] = max(Arb[Ind*2],Arb[Ind*2+1]);
        }
}

int main()
{
    int n,m,x,a,b;
    fin>>n>>m;

    for (int i=1;i<=n;i++)
        fin>>V[i];

    ArbInt(1,1,n);

    for (int i=0;i<m;i++)
    {
        fin>>x>>a>>b;

        if (x==0)
            fout<<Maxi(1,1,n,a,b)<<"\n";
        else
            Schimb(1,1,n,a,V[b]);

    }

    fin.close();
    fout.close();
    return 0;

}