Cod sursa(job #3031788)

Utilizator SSKMFSS KMF SSKMF Data 20 martie 2023 19:47:35
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream cin ("datorii.in");
ofstream cout ("datorii.out");

vector <long long> Arbore;
vector <int> datorii_initiale;

void Creare_Arbore (int nod , int stanga , int dreapta)
{
    if (stanga == dreapta)
        Arbore[nod] = datorii_initiale[stanga];
    else
    {
        int mijloc = (stanga + dreapta) / 2;

        Creare_Arbore(2 * nod , stanga , mijloc);
        Creare_Arbore(2 * nod + 1 , mijloc + 1 , dreapta);

        Arbore[nod] = Arbore[2 * nod] + Arbore[2 * nod + 1];
    }
}

void Scadere (int nod , int stanga , int dreapta , int pozitie , int valoare)
{
    if (stanga == dreapta)
        Arbore[nod] -= valoare;
    else
    {
        int mijloc = (stanga + dreapta) / 2;

        if (pozitie <= mijloc)
            Scadere(2 * nod , stanga , mijloc , pozitie , valoare);
        else
            Scadere(2 * nod + 1 , mijloc + 1 , dreapta , pozitie , valoare);

        Arbore[nod] = Arbore[2 * nod] + Arbore[2 * nod + 1];
    }
}

long long Suma (int nod , int stanga , int dreapta , int interval_stanga , int interval_dreapta)
{
    if (interval_stanga <= stanga && dreapta <= interval_dreapta)
        return Arbore[nod];

    int mijloc = (stanga + dreapta) / 2;
    long long suma_1 = 0 , suma_2 = 0;

    if (interval_stanga <= mijloc)
        suma_1 = Suma(2 * nod , stanga , mijloc , interval_stanga , interval_dreapta);

    if (interval_dreapta > mijloc)
        suma_2 = Suma(2 * nod + 1 , mijloc + 1 , dreapta , interval_stanga , interval_dreapta);

    return suma_1 + suma_2;
}

int main ()
{
    int lungime , operatii;
    cin >> lungime >> operatii;

    datorii_initiale.resize(lungime + 1) , Arbore.resize(4 * lungime + 1);
    for (int indice = 1 ; indice <= lungime ; indice++)
        cin >> datorii_initiale[indice];

    Creare_Arbore(1 , 1 , lungime);

    int tip , stanga , dreapta;
    for (int indice = 1 ; indice <= operatii ; indice++)
    {
        cin >> tip >> stanga >> dreapta;

        if (!tip)
            Scadere(1 , 1 , lungime , stanga , dreapta);
        else
            cout << Suma(1 , 1 , lungime , stanga , dreapta) << '\n';
    }

    cout.close(); cin.close();
    return 0;
}