Cod sursa(job #2945810)

Utilizator alexboat10759Alex Mateescu alexboat10759 Data 24 noiembrie 2022 09:50:44
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>

using namespace std;

int aint[4 * 15000 + 5], sum = 0;
int v[15005];

struct interval
{
    int st, dr;
};

void update(int nod, int poz, int val, interval x)
{
    if(x.st == x.dr)
    {
        aint[nod] -= val;
        return;
    }


    int mij = (x.st + x.dr) / 2;

    if(poz <= mij)
        update(nod * 2, poz, val, {x.st, mij});
    if(poz > mij)
        update(nod * 2 + 1, poz, val, {mij + 1, x.dr});

    aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
    return;
}

void query(int nod, int st, int dr, interval x)
{
    if(x.st >= st && x.dr <= dr)
    {
        sum += aint[nod];
        return;
    }
    int mij = (x.st + x.dr) / 2;
    if(st <= mij)
        query(nod * 2, st, mij, {x.st, mij});
    if(dr >= mij + 1)
        query(nod * 2 + 1, mij + 1, dr, {mij + 1, x.dr});
    return;
}

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

    int n, m;
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        cin>>v[i];
        update(1, i, -v[i], {1, n});
    }

    for(int i = 1; i <= m; i++)
    {
        int cer, a, b;
        cin>>cer>>a>>b;
        if(cer == 0)
            update(1, a, b, {1, n});
        if(cer == 1)
        {
            sum = 0;
            query(1, a, b, {1, n});
            cout<<sum<<'\n';
        }
    }
    return 0;
}