Cod sursa(job #3173397)

Utilizator internetexplorerInternet Explorer internetexplorer Data 22 noiembrie 2023 19:48:19
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>

using namespace std;

const int NMax = 15005;

int aint[NMax*4], sum;

void build(int nod, int st, int dr)
{
    if(st==dr)
        cin>>aint[nod];
    else
    {
        int mij=(st+dr)/2;
        build(2*nod, st, mij);
        build(2*nod+1, mij+1, dr);

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

void query(int nod, int st, int dr, int a, int b)
{
    //cout << nod << " " << st << " " << dr << '\n';
    if (a <= st && dr <= b)
    {
        sum+=aint[nod];
    }
    else
    {
        int mij=(st+dr)/2;
        if (a <= mij)
            query(2*nod, st, mij, a, b);
        if (b > mij)
            query(2*nod+1, mij+1, dr, a, b);
    }
}

void update(int nod, int st, int dr, int a, int b)
{
    if (st==dr)
        aint[nod]-=b;
    else
    {
        int mij=(st+dr)/2;
        if (a <= mij)
            update(2*nod, st, mij, a, b);
        else
            update(2*nod+1, mij+1, dr, a, b);
        aint[nod] -= b;
    }
}

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin>>n>>m;
    build(1,1,n);
    while(m--)
    {
        int op,a,b;
        cin>>op>>a>>b;
        if(op==1)
        {
            sum=0;
            query(1,1,n,a,b);
            cout<<sum<<'\n';
        }

        else
            update(1,1,n,a,b);


    }
    return 0;
}