Cod sursa(job #2821025)

Utilizator stefandutastefandutahoria stefanduta Data 22 decembrie 2021 00:18:30
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#define NMAX 15005

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

int n, m, i, j, op, a, b;
int v[NMAX];
int aint[NMAX * 4];

void build(int node, int nleft, int nright)
{
    if (nleft == nright)
    {
        aint[node] = v[nleft];
    }
    else
    {
        int nmid = (nleft + nright) / 2;
        int leftson = node + 1;
        int rightson = node + 2 * (nmid - nleft + 1);

        build(leftson, nleft, nmid);
        build(rightson, nmid + 1, nright);

        aint[node] = aint[leftson] + aint[rightson];
    }
}

int query(int node, int nleft, int nright, int qleft, int qright)
{
    if (qleft <= nleft && qright >= nright)
        return aint[node];

    int nmid = (nleft + nright) / 2;
    int leftson = node + 1;
    int rightson = node + 2 * (nmid - nleft + 1);
    int rez = 0;

    if (qleft <= nmid)
        rez = rez + query(leftson, nleft, nmid, qleft, qright);
    if (nmid < qright)
        rez = rez + query(rightson, nmid + 1, nright, qleft, qright);

    return rez;
}

void update(int node, int nleft, int nright, int poz, int val)
{
    if (nleft == nright)
    {
        aint[node] = aint[node] - val;
        return ;
    }

    int nmid = (nleft + nright) / 2;
    int leftson = node + 1;
    int rightson = node + 2 * (nmid - nleft + 1);

    if (poz <= nmid)
        update(leftson, nleft, nmid, poz, val);
    else if (poz > nmid)
        update(rightson, nmid + 1, nright, poz, val);

    aint[node] = aint[leftson] + aint[rightson];
}

int main()
{
    in >> n >> m;
    for (i = 0; i < n; ++i)
    {
        in >> v[i];
    }

    build(0, 0, n - 1);

    for (i = 1; i <= m; ++i)
    {
        in >> op >> a >> b;
        if (op == 0)
        {
            update(0, 0, n - 1, a - 1, b);
        }
        else if (op == 1)
        {
            out << query(0, 0, n - 1, a - 1, b - 1) << '\n';
        }
    }
    return 0;
}