Cod sursa(job #2092837)

Utilizator papinub2Papa Valentin papinub2 Data 22 decembrie 2017 14:07:23
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

const int Nmax = 15005;

int v[Nmax], ValArb[3 * Nmax];

void Update (int poz, int val, int nod, int st, int dr)
{
    if (st == dr)
    {
        ValArb[nod] = ValArb[nod] + val;
        return;
    }

    int mij = (st + dr) / 2;

    if (poz <= mij)
        Update (poz, val, nod * 2, st, mij);
    else
        Update (poz, val, nod * 2 + 1, mij + 1, dr);

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

void Query (int &rez, int Start, int Final, int nod, int st, int dr)
{
    if (st == dr)
    {
        rez = rez + ValArb[nod];
        return;
    }

    int mij = (st + dr) / 2;

    if (mij >= Start) Query (rez, Start, Final, nod * 2, st, mij);
    if (mij < Final) Query (rez, Start, Final, nod * 2 + 1, mij + 1, dr);
}

int main()
{
    int n, m;
    in >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        in >> v[i];
        Update (i, v[i], 1, 1, n);
    }

    for (int i = 1; i <= m; i++)
    {
        int op, a, b;
        in >> op >> a >> b;

        if (op == 0)
            Update (a, -b, 1, 1, n);

        else
        {
            int rez = 0;
            Query (rez, a, b, 1, 1, n);

            out << rez << '\n';
        }
    }

    return 0;
}