Cod sursa(job #3338875)

Utilizator MihaishaRailean Mihai Mihaisha Data 5 februarie 2026 12:48:15
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;

int a[15010], H[60040];
int n, m, nr, idx, f, l, r;

void build(int start, int end, int node) {
    if(start == end) {
        H[node] = a[start];
        return;
    }
    int mid = (start + end) >> 1;
    build(start, mid, 2*node);
    build(mid+1, end, 2*node+1);
    H[node] = H[2*node] + H[2*node+1];
}

void update(int start, int end, int node) {
    if(start == end) {
        H[node] -= nr;
        return;
    }
    int mid = (start + end) >> 1;
    if(idx <= mid) update(start, mid, 2*node);
    else update(mid+1, end, 2*node+1);
    H[node] = H[2*node] + H[2*node+1];
}

int query(int start, int end, int node) {
    if(l <= start && end <= r) return H[node];
    int mid = (start + end) >> 1;
    int leftSum = 0, rightSum = 0;
    if(l <= mid) leftSum = query(start, mid, 2*node);
    if(r > mid) rightSum = query(mid+1, end, 2*node+1);
    return leftSum + rightSum;
}

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, n, 1);

    for(int i = 0; i < m; i++) {
        fin >> f;
        if (f) { 
            fin >> l >> r;
            fout << query(1, n, 1) << '\n';
        } else { 
            fin >> idx >> nr;
            update(1, n, 1);
        }
    }
    return 0;
}