Cod sursa(job #2751720)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 15 mai 2021 17:52:29
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>

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

int n,m;
int arb[60004];
int A[15001];

void Arb(int poz, int st, int dr)
{
    if(st==dr) //sunt pe frunza
    {
        arb[poz]=A[st];
        return;
    }

    else
    {
        int mijl=(st+dr)/2;
        Arb(poz*2,st,mijl);
        Arb(poz*2+1,mijl+1,dr);

        arb[poz]=arb[poz*2]+ arb[poz*2+1];
    }

}
int Suma(int poz, int pozstart, int pozfinal, int st,int dr) //pozstart, pozfinal- pentru intervalul cautat; st,dr- pentru intervalul nodului curent
{
    if(st>=pozstart && dr<=pozfinal) //cu totul in interiorul intervalului
        return arb[poz];

    if(pozstart>dr || st>pozfinal) //cu totul in afara intervalului
        return 0; //0 element neutru la suma

    int mijl=(st+dr)/2;

    int val1=Suma(2*poz, pozstart, pozfinal, st, mijl);
    int val2=Suma(2*poz+1, pozstart, pozfinal, mijl+1, dr);

    return val1+val2;


}
void Achitare(int poznod, int pozupdate,int val, int st, int dr) // st, dr- pentru intervalul nodului curent
{
    if(st==dr)
    {
        arb[poznod]-=val;
        return;
    }
    else
    {
        int mijl=(st+dr)/2;
        if(pozupdate<=mijl)
            Achitare(poznod*2, pozupdate, val, st, mijl);
        else
            Achitare(poznod*2+1, pozupdate, val, mijl+1, dr);

        arb[poznod]=arb[poznod*2]+ arb[poznod*2+1];
    }

}

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

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

    Arb(1,1,n); //radacina pe pozitia 1

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

        if(task==0) //achitare, la ziua a se scad b bani
            Achitare(1,a,b,1,n);
        else
             fout<<Suma(1,a,b,1,n)<<"\n";
    }

    return 0;
}