Cod sursa(job #2712074)

Utilizator racleta31Andreican Rares racleta31 Data 25 februarie 2021 09:43:44
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int nmax = 100001;
const int arbmax = 4*nmax + 66;
int n, m;
int A[arbmax];
int insi[nmax];

int combine(int a, int b)
{
    return a+b;
}
void build(int v, int tl, int tr)
{
    if(tl == tr)
        A[v] = insi[tl];

    else
    {
        int tm = (tl + tr) >> 1;

        build(2 * v, tl, tm);
        build(2 * v + 1, tm + 1, tr);
        A[v] = combine(A[2 * v], A[2 * v + 1]);
    }
}

int query(int nod, int st, int dr, int a, int b)
{
    if(st == dr)
    {
        return A[nod];
    }
    int mij = (st+ dr) >> 1;
    if(b <= mij)
    {
        return query(nod*2, st, mij, a, b);
    }
    if(a > mij)
    {
        return query(2*nod+1, mij+1, dr, a, b);
    }
    return combine(query(nod*2, st, mij, a, mij),
                   query(nod*2+1, mij+1, dr, mij+1, b));

}
void update(int v, int tl, int tr, int pos, int val)
{
    if(tl == tr)
        A[v] -= val;

    else
    {
        int tm = (tl + tr) >> 1;

        if (pos <= tm)
            update(2 * v, tl, tm, pos, val);
        else
            update(2 * v + 1, tm + 1, tr, pos, val);

       A[v] = combine(A[2*v], A[2*v+1]);
    }
}

int q, x, y;
int main()
{
    in>>n>>m;
    for(int i = 1 ; i <= n ; i++)
        in >> insi[i];
    build(1, 1, n);

    for(int i=1; i<=m; i++)
    {
        in>>q>>x>>y;
        if(q == 1)
        {
            out<<query(1, 1, n, x, y)<<'\n';
        }
        else
        {
            update(1, 1, n, x,y);
        }
    }
    return 0;
}