Cod sursa(job #3301542)

Utilizator Barbu_MateiBarbu Matei Barbu_Matei Data 27 iunie 2025 16:48:13
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
using namespace std;

int n, m;
int aint[4 * 15001];

void buildAint(int node, int st, int dr) {
    if (st == dr) {
        int k;
        cin >> k;
        aint[node] = k;
        return;
    }
    int mid = (st + dr) / 2;
    buildAint(2 * node, st, mid);
    buildAint(2 * node + 1, mid + 1, dr);
    aint[node] = aint[2 * node] + aint[2 * node + 1];
}

void update(int node, int st, int dr, int t, int v) {
    if (st > t || dr < t) {
        return;
    }
    if (st == dr && st == t) {
        aint[node] -= v;
        return;
    }
    int mid = (st + dr) / 2;
    update(2 * node, st, mid, t, v);
    update(2 * node + 1, mid + 1, dr, t, v);
    aint[node] -= v;
}

int query(int node, int st, int dr, int x, int y) {
    if (st > y || dr < x) {
        return 0;
    }
    if (st >= x && dr <= y) {
        return aint[node];
    }
    int mid = (st + dr) / 2;
    int leftSub = query(2 * node, st, mid, x, y);
    int rightSub = query(2 * node + 1, mid + 1, dr, x, y);
    return leftSub + rightSub;
}

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