Cod sursa(job #3343118)

Utilizator www_wwwVeverita Tudor www_www Data 26 februarie 2026 15:01:48
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 15005;
int N, M;
int A[MAXN];
int tree[4 * MAXN];

void build(int node, int l, int r) {
    if (l == r) {
        tree[node] = A[l];
        return;
    }
    int mid = (l + r) / 2;
    build(node * 2, l, mid);
    build(node * 2 + 1, mid + 1, r);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

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

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

int main()
{
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");
    
    fin >> N >> M;
    for (int i = 1; i <= N; i++) fin >> A[i];
    build(1, 1, N);
    for (int i = 0; i < M; i++) {
        int cod, x, y;
        fin >> cod >> x >> y;
        if (cod == 0) update(1, 1, N, x, y);
        else fout << query(1, 1, N, x, y) << "\n";
    }
    
    return 0;
}