Cod sursa(job #3308971)

Utilizator parrot279Sofi Tudose parrot279 Data 30 august 2025 14:57:01
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int det(int a, int b, int st, int dr, int nod);
void update(int poz, int val, int st, int dr, int nod);

int arbore[4000002], n, m;

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fin>>n>>m;
    for(int i = 1; i <= n; ++i)
    {
        int nr;
        fin>>nr;
        update(i, nr, 1, n, 1);
    }

    for(int i = 1; i <= m; ++i)
    {
        int tip, a, b;
        fin>>tip>>a>>b;
        if(tip == 0)
            update(a, b, 1, n, 1);
        else
            fout<<det(a, b, 1, n, 1)<<"\n";

    }







    return 0;
}

void update(int poz, int val, int st, int dr, int nod)
{
    if(st == dr)
    {
        if(arbore[nod] == 0)
            arbore[nod] = val;
        else
            arbore[nod] -= val;
        return;
    }
    int mijl = (st + dr) / 2;
    if(poz <= mijl)
    {
        update(poz, val, st, mijl, 2 * nod);
    }
    else
    {
        update(poz, val, mijl + 1, dr, 2 * nod + 1);
    }
    arbore[nod] = arbore[nod * 2] + arbore[nod * 2 + 1];
}

int det(int a, int b, int st, int dr, int nod)
{
    if(a <= st && dr <= b)
        return arbore[nod];

    int mijl = (st + dr) / 2, suma = 0;
    if(mijl >= a)
        suma += det(a, b, st, mijl, 2 * nod);
    if(mijl + 1 <= b)
        suma += det(a, b, mijl + 1, dr, 2 * nod + 1);

    return suma;
}