Cod sursa(job #2918442)

Utilizator Luca_CristianZamfir Luca-Cristian Luca_Cristian Data 11 august 2022 15:32:38
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>


using namespace std;

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

int tree[60001], v[15001];
void build(int v[], int node, int lx, int rx)
{
    if(rx - lx == 1)
    {
        tree[node] = v[lx];
        return;
    }

    int mij = (lx + rx) / 2;
    build(v, 2 * node + 1, lx, mij);
    build(v, 2 * node + 2, mij, rx);
    tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
}
void scad(int i, int val, int node, int lx, int rx)
{
    if(rx - lx == 1)
    {
        tree[node] -= val;
        return;
    }
    int mij = (lx + rx) / 2;
    if(i <= mij)
        scad(i, val, 2 * node + 1, lx, mij);
    else
        scad(i, val, 2 * node + 2, mij, rx);
    tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
}
int sum(int l, int r, int node, int lx, int rx)
{
    if(l <= lx && rx <= r)
        return tree[node];
    if(lx >= r || rx <= l)
        return 0;
    int mij = (lx + rx) / 2;
    int s1, s2;

    s1 = sum(l, r, 2 * node + 1, lx, mij);
    s2 = sum(l, r, 2 * node + 2, mij, rx);
    return s1 + s2;
}


int main()
{
    int n, q, i;

    fin >> n >> q;

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


    for(i = 0; i < q; i++)
    {
        int tip, a, b;
        fin >> tip >> a >> b;
        if(tip == 0)
            --a, scad(a, b, 0, 0, n);
        else
            --a, fout << sum(a, b, 0, 0, n) << '\n';
    }

    return 0;
}