Cod sursa(job #3350207)

Utilizator mihai.25Calin Mihai mihai.25 Data 6 aprilie 2026 12:27:58
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>

#include <vector>

using namespace std;

vector<int> segment_tree, a;

void build(int node, int left, int right) {

    if (left == right)
        segment_tree[node] = a[left];
    else {

        int middle = (left + right) / 2;

        build(2 * node, left, middle);

        build(2 * node + 1, middle + 1, right);

        segment_tree[node] = segment_tree[2 * node] + segment_tree[2 * node + 1];
    }
}

void update(int node, int left, int right, int position, int value) {

    if (left == right)
        segment_tree[node] -= value;
    else {

        int middle = (left + right) / 2;

        if (position <= middle)
            update(2 * node, left, middle, position, value);
        else
            update(2 * node + 1, middle + 1, right, position, value);
        
        segment_tree[node] = segment_tree[2 * node] + segment_tree[2 * node + 1];
    }
}

int query(int node, int left, int right, int query_left, int query_right) {

    if (query_left <= left && right <= query_right)
        return segment_tree[node];
    else {

        int middle = (left + right) / 2;

        if (query_right <= middle)
            return query(2 * node, left, middle, query_left, query_right);
        
        if (middle + 1 <= query_left)
            return query(2 * node + 1, middle + 1, right, query_left, query_right);
        
        return query(2 * node, left, middle, query_left, query_right) + query(2 * node + 1, middle + 1, right, query_left, query_right);
    }
}

int main() {

    ifstream fin("datorii.in");

    ofstream fout("datorii.out");

    int n, m;

    fin >> n >> m;

    a.resize(n + 1);

    for (int i = 1; i <= n; ++i)
        fin >> a[i];
    
    segment_tree.resize(4 * n);

    build(1, 1, n);

    for (int i = 1; i <= m; ++i) {

        int op;

        fin >> op;

        if (op == 0) {

            int t, v;

            fin >> t >> v;

            update(1, 1, n, t, v);
        }
        else {

            int p, q;

            fin >> p >> q;

            fout << query(1, 1, n, p, q) << '\n';
        }
    }

    return 0;
}