Cod sursa(job #2903280)

Utilizator Teodor_AxinteAxinte Teodor-Ionut Teodor_Axinte Data 17 mai 2022 12:21:31
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>

using namespace std;

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

const int N = 100010;

int n, m, i, op, val, poz, pozFinal;
int arbore[N], v[N];

void create(int nod, int left, int right)
{
    if (left == right)
    {
        arbore[nod] = v[left - 1];
        return;
    }
    create(nod * 2, left, (left + right) / 2);
    create(nod * 2 + 1, (left + right) / 2 + 1, right);
    arbore[nod] = arbore[nod * 2] + arbore[nod * 2 + 1];
}

void modif(int nod, int left, int right, int poz, int val)
{
    if (poz < left || poz > right)
        return;

    if (left == right)
    {
        arbore[nod] -= val;
        return;
    }

    if (poz <= (left + right) / 2)
        modif(nod * 2, left, (left + right) / 2, poz, val);
    else
        modif(nod * 2 + 1, (left + right) / 2 + 1, right, poz, val);

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

int sum(int nod, int left, int right, int i, int j)
{
    if (right < i || left > j)
        return 0;

    if (i <= left && j >= right)
        return arbore[nod];

    return sum(nod * 2, left, (left + right) / 2, i, j) + sum(nod * 2 + 1, (left + right) / 2 + 1, right, i, j);
}

int main()
{
    fin >> n >> m;

    for (int i = 0; i < n; i++)
        fin >> v[i];

    create(1, 1, n);

    for (int i = 1; i <= m; i++)
    {
        fin >> op >> poz;
        if (op == 0)
        {
            fin >> val;
            modif(1, 1, n, poz, val);
        }
        else
        {
            fin >> pozFinal;
            fout << sum(1, 1, n, poz, pozFinal) << '\n';
        }
    }

    return 0;
}