Cod sursa(job #2754893)

Utilizator IPCristianIlie Cristian IPCristian Data 26 mai 2021 17:32:34
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

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

int Arb[60010],V[15010];

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);

            Arb[Ind] = Arb[Ind*2] + Arb[Ind*2+1];
        }
}

int Suma(int Ind,int St,int Dr,int MargInf,int MargSup)
{
    if (MargInf > MargSup)
        return 0;

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

    int Mij = (St+Dr)/2;

    return Suma(Ind*2,St,Mij,MargInf,min(MargSup,Mij))+Suma(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)
    {
        if (Arb[Ind]-Val < 0)
            Arb[Ind] = 0;
        else
            Arb[Ind] = 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] = Arb[Ind*2]+Arb[Ind*2+1];
        }
}

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

    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)
            fout<<Suma(1,1,n,a,b)<<"\n";
        else
            Schimb(1,1,n,a,b);
    }

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

}