Cod sursa(job #3338894)

Utilizator malendraecaterinaMalendra Ecaterina malendraecaterina Data 5 februarie 2026 13:12:03
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 15005; 
int n, m;
int aint[4 * MAXN];

void build(int node, int st, int dr, int val[]) {
    if (st == dr) {
        aint[node] = val[st];
        return;
    }
    int mid = (st + dr) / 2;
    build(2 * node, st, mid, val);
    build(2 * node + 1, mid + 1, dr, val);
    aint[node] = aint[2 * node] + aint[2 * node + 1];
}


void update(int node, int st, int dr, int pos, int val) {
    if (st == dr) {
        aint[node] -= val; 
        return;
    }
    int mid = (st + dr) / 2;
    if (pos <= mid) {
        update(2 * node, st, mid, pos, val);
    } else {
        update(2 * node + 1, mid + 1, dr, pos, val);
    }
    aint[node] = aint[2 * node] + aint[2 * node + 1];
}

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

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

    fin >> n >> m;
    int a[MAXN];
    for (int i = 1; i <= n; i++) {
        fin >> a[i];
    }

    build(1, 1, n, a);

    for (int i = 0; i < m; i++) {
        int op, x, y;
        fin >> op >> x >> y;
        if (op == 0) {

            update(1, 1, n, x, y);
        } else {
            fout << query(1, 1, n, x, y) << "\n";
        }
    }

    fin.close();
    fout.close();
    return 0;
}