Cod sursa(job #2903406)

Utilizator Alexandru_PotangaPotanga Alexandru Alin Alexandru_Potanga Data 17 mai 2022 15:57:18
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int A[60001];
void scade(int nod, int left, int right, int poz, int x)
{
    if(poz < left || poz > right)
        return;
    if(left == right)
    {
        A[nod] -= x;
        return;
    }
    scade(nod * 2, left, (left + right) / 2, poz, x);
    scade(nod * 2 + 1, (left + right) / 2 + 1, right, poz, x);
    A[nod] = A[2 * nod] + A[2 * nod + 1];
}
int suma(int nod, int left, int right, int st, int dr)
{
    if(dr < left || st > right)
        return 0;
    if(st <= left && right <= dr)
        return A[nod];
    return suma(nod * 2, left, (left + right) / 2, st, dr) + suma(nod * 2 + 1, (left + right) / 2 + 1, right, st, dr);
}
void actualizare(int nod, int left, int right, int poz, int x)
{
    if(poz < left || poz > right)
        return;
    if(left == right)
    {
     A[nod] = x;
     return;
    }
    actualizare(nod * 2, left, (left + right) / 2, poz, x);
    actualizare(nod * 2 + 1, (left + right) / 2 + 1, right, poz, x);
    A[nod] = A[nod * 2] + A[nod * 2 + 1];
}
int main()
{
    int n, m, a, b, instr;
    f >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        f >> a;
        actualizare(1, 1, n, i, a);
    }

    for(int i = 0; i < m; i++)
    {
        f >> instr >> a >> b;
        if(instr == 0)
            scade(1, 1, n, a, b);
        if(instr == 1)
            g << suma(1, 1, n, a, b) << "\n";
    }
    return 0;
}