Cod sursa(job #3338888)

Utilizator ilie_2008Iamboglo Ilie ilie_2008 Data 5 februarie 2026 13:02:43
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
using namespace std;

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

const int MAXN = 15000;

int N, M;
long long arb[4 * MAXN + 5];

void build(int nod, int st, int dr) {
    if (st == dr) {
        fin >> arb[nod];
        return;
    }
    int mid = (st + dr) / 2;
    build(nod * 2, st, mid);
    build(nod * 2 + 1, mid + 1, dr);
    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

void update(int nod, int st, int dr, int poz, long long val) {
    if (st == dr) {
        arb[nod] -= val;
        return;
    }
    int mid = (st + dr) / 2;
    if (poz <= mid)
        update(nod * 2, st, mid, poz, val);
    else
        update(nod * 2 + 1, mid + 1, dr, poz, val);
    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

long long query(int nod, int st, int dr, int l, int r) {
    if (l <= st && dr <= r)
        return arb[nod];
    int mid = (st + dr) / 2;
    long long s = 0;
    if (l <= mid)
        s += query(nod * 2, st, mid, l, r);
    if (r > mid)
        s += query(nod * 2 + 1, mid + 1, dr, l, r);
    return s;
}

int main() {
    fin >> N >> M;
    build(1, 1, N);

    for (int i = 1; i <= M; i++) {
        int tip, a, b;
        fin >> tip >> a >> b;
        if (tip == 0) {
            update(1, 1, N, a, b);
        } else {
            fout << query(1, 1, N, a, b) << "\n";
        }
    }
    return 0;
}