Cod sursa(job #3156541)

Utilizator GoreaRaresGorea Rares-Andrei GoreaRares Data 11 octombrie 2023 18:43:31
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>

using namespace std;

int v[100001], aint[400001];

void build(int nod, int l, int r)
{
    int mij;
    if(l == r)
    {
        aint[nod] = v[l];
        return;
    }
    mij = (l + r) / 2;
    build(2 * nod, l, mij);
    build(2 * nod + 1, mij + 1, r);
    aint[nod] = aint[2 * nod + 1] + aint[2 * nod];
}

void update(int nod, int l, int r, int pos, int val)
{
    int mij;
    if(l == r)
    {
        aint[nod] -= val;
        return;
    }
    mij = (l + r) / 2;
    if(pos <= mij)
    {
        update(2 * nod, l, mij, pos, val);
    }
    else
    {
        update(2 * nod + 1, mij + 1, r, pos, val);
    }
    aint[nod] = aint[2 * nod + 1] + aint[2 * nod];
}

int query(int nod, int l, int r, int st, int dr)
{
    int mij;
    if(st == l && dr == r)
    {
        return aint[nod];
    }
    mij = (l + r) / 2;
    if(dr <= mij)
    {
        return query(2 * nod, l, mij, st, dr);
    }
    if(st > mij)
    {
        return query(2 * nod + 1, mij + 1, r, st, dr);
    }
    return query(2 * nod, l, mij, st, mij) + query(2 * nod + 1, mij + 1, r, mij + 1, dr);
}

int main()
{
    ifstream cin("datorii.in");
    ofstream cout("datorii.out");
    int n, m, t, x, y, i;
    cin >> n >> m;
    for(i = 1; i <= n; i++)
    {
        cin >> v[i];
    }
    build(1, 1, n);
    for(i = 1; i <= m; i++)
    {
        cin >> t >> x >> y;
        if(t == 0)
        {
            update(1, 1, n, x, y);
        }
        else
        {
            cout << query(1, 1, n, x, y) << "\n";
        }
    }
    return 0;
}