Cod sursa(job #2949077)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 29 noiembrie 2022 17:56:00
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>

using namespace std;

ifstream cin("datorii.in");
ofstream cout("datorii.out");

const int NMAX = 15e3;

int tree[4 * NMAX + 1], v[NMAX + 1], n, q;

void build(int node, int st, int dr){

    if(st == dr){

        tree[node] = v[st];
        return;

    }

    int mid = ((st + dr) >> 1);

    build(2 * node, st, mid);
    build(2 * node + 1, mid + 1, dr);

    tree[node] = tree[2 * node] + tree[2 * node + 1];

}

void update(int node, int st, int dr, int poz){

    if(st == dr){

        tree[node] = v[poz];
        return;

    }

    int mid = ((st + dr) >> 1);

    if(mid < poz)
        update(2 * node + 1, mid + 1, dr, poz);
    else
        update(2 * node, st, mid, poz);

    tree[node] = tree[2 * node] + tree[2 * node + 1];

}

int query(int node, int st, int dr, int l, int r){

    if(l <= st && dr <= r)
        return tree[node];

    int mid = ((st + dr) >> 1), s = 0;

    if(l <= mid)
        s += query(2 * node, st, mid, l, r);

    if(mid < r)
        s += query(2 * node + 1, mid + 1, dr, l, r);

    return s;
}

int main(){

    cin >> n >> q;

    for(int i = 1; i <= n; i++)
        cin >> v[i];

    build(1, 1, n);

    for(int i = 0; i < q; i++){

        int op = 0, x = 0, y = 0;
        cin >> op >> x >> y;

        if(op == 0){

            v[x] -= y;

            if(v[x] < 0)
                v[x] = 0;

            update(1, 1, n, x);

        }else{

            cout << query(1, 1, n, x, y) << "\n";

        }

    }

    return 0;
}