Cod sursa(job #2903550)

Utilizator Andreeamiruna27Mindrescu Andreea Andreeamiruna27 Data 17 mai 2022 18:02:10
Problema Datorii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>

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

int arbore[100000], v[16000];

void creeaza(int nod, int L, int R)
{
    if(L == R)
    {
        arbore[nod] = v[L - 1];
        return;
    }

    creeaza(nod * 2 + 1, (L + R) / 2 + 1, R);
    creeaza(nod * 2, L, (L + R) / 2);
    arbore[nod] = arbore[nod * 2] + arbore[nod * 2 + 1];
}

void modifica(int nod, int L, int R, int poz, int val)
{
    if(poz < L || poz > R)
        return;

    if(L == R)
    {
        arbore[nod] -= val;
        return;
    }

    if(poz <= (L + R) / 2)
        modifica(nod * 2, L, (L + R) / 2, poz, val);
    else
        modifica(nod * 2 + 1, (L + R) / 2 + 1, R, poz, val);

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

int adun(int nod, int L, int R, int i, int j)
{
    if(R < i || L > j)
        return 0;

    if(i <= L && j >= R)
        return arbore[nod];

    return adun(nod * 2, L, (L + R) / 2, i, j) + adun(nod * 2 + 1, (L + R) / 2 + 1, R, i, j);
}

int main()
{
    int n, m, i, op, val, poz, pozFinal;

    in>>n>>m;

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

    creeaza(1, 1, n);

    for(i = 1; i <= m; i++)
    {
        in>>op>>poz;

        if(op == 0)
        {
            in>>val;
            modifica(1, 1, n, poz, val);
        }
        else
        {
            in>>pozFinal;
            out<<adun(1, 1, n, poz, pozFinal)<<'\n';
        }
    }

    return 0;
}