Cod sursa(job #2749075)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 4 mai 2021 21:27:46
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb

#include<fstream>

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

int n, i, v[100001], m;
int op, poz, nr;
int arb[400001];
///datoriile zilnice vor fi in nodurile frunza
///in radacina va fi datoria pe toate zilele

//1+2+3+4+5+6
//1+2+3  4+5+6
//1+2 3  4+5 6
//1 2    4 5
///in fiecare subarbore datoriile in zilele din prima jum

void build(int poz, int st, int dr)
{
    if(st == dr)/// am ajuns la o frunza
    {
        arb[poz] = v[st];
    }
    else
    {
        int mid = (st + dr)/2;
        build(poz * 2, st, mid);
        build(poz * 2 + 1, mid + 1,dr);
        arb[poz] = arb[2 * poz] + arb[2 * poz + 1];///radacina va fi suma celor 2 subarbori
    }
}
void update(int poz, int nr, int st, int dr, int p)
{
    if(st == dr)    ///am ajuns la ziua respectiva
    {
        arb[poz]-=nr;
        return;
    }
    int mid = (st + dr)/2;
    if(p <= mid)    ///vedem in care subarbore se afla
        update(poz*2 ,nr, st, mid, p);      ///modific si sumele care contin ziua respectiva
    else
        update(poz * 2 + 1, nr, mid + 1, dr, p);

    arb[poz] -= nr;
}
int query(int qst, int qdr, int st, int dr, int poz)        ///qst qdr intervalul de zile cautat
{
    /// initial poz = 1 --> radacina --> stim ca aceasta memoreaza datoriile din zilele 1->n
    /// facem cele 2 jum, dar dupa o jum de va interesa partial


    if(st >= qst && dr <= qdr)
        return arb[poz];
    if(st > qdr)
        return 0;
    if(dr < qst)
        return 0;
    int mid = (st+dr)/2;
    int a,b;
    a = query(qst, qdr, st, mid, poz*2);        ///cautam cea mai mare radacina care contine un interval complet de zile
    b = query(qst, qdr, mid+1, dr, poz*2+1);
    return a + b;
}
int main()
{
    fin >> n >> m;
    for(i = 1; i <= n; i++)
        fin >> v[i];
    build(1,1,n);
    for(i = 1; i <= m; i++)
    {
        fin >> op >> poz >> nr;
        if(op == 0)
            update(1, nr, 1, n, poz);
        else
            fout << query(poz, nr, 1, n, 1)<<"\n";
    }
}