Cod sursa(job #2754876)

Utilizator andre.anghelacheAndreea Anghelache andre.anghelache Data 26 mai 2021 17:09:18
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector<int> datorii(60004);

int suma_sume_restante(int x, int y, int nod_curent, int stanga, int dreapta)
{
    if(x <= stanga && dreapta <= y)
        return datorii[nod_curent];
    int mijloc = (stanga+dreapta)/2, suma=0;

    if(x<=mijloc) //se duce in stanga
        suma += suma_sume_restante(x, y, nod_curent*2, stanga, mijloc);
    if(y>mijloc) //se duce in dreapta
        suma += suma_sume_restante(x, y, nod_curent*2+1, mijloc+1, dreapta);

    return suma;
}

void inserare(int valoare, int nod_curent, int stanga, int dreapta, int pozitie)
{
    if (stanga == dreapta) {
        datorii[nod_curent] += valoare;
        return;
    }

    int mijloc = (stanga + dreapta) / 2;
    if (pozitie <= mijloc)
    { inserare(valoare, 2 * nod_curent, stanga, mijloc, pozitie);}
    else
    { inserare(valoare, 2 * nod_curent + 1, mijloc + 1, dreapta, pozitie);}

    datorii[nod_curent] = datorii[2*nod_curent] + datorii[2*nod_curent+1];
}

int main() {
    ifstream in("datorii.in");
    ofstream out("datorii.out");


    int n, nr_operatii, element;
    in>>n>>nr_operatii;

    for(int i=1; i<=n; i++)
    {
        in>>element;
        inserare(element, 1, 1, n, i);
    }

    for(int i=1; i<=nr_operatii; i++)
    {
        int tip_operatie, valoare_platita, zi_restanta, p, q;
        in>>tip_operatie;

        if(tip_operatie==0)
        {
            in>>zi_restanta>>valoare_platita;
            inserare(-valoare_platita, 1, 1, n, zi_restanta);
        }
        else
        {
            in>>p>>q;
            out<<suma_sume_restante(p, q, 1, 1, n)<<"\n";
        }
    }
    
    in.close(); out.close();
    return 0;
}