Cod sursa(job #3041892)

Utilizator runaMurgu Andrei runa Data 2 aprilie 2023 13:12:36
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <fstream>

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

const int max = 15001;

int tree[max * 4], array[max];

void build(int node, int left, int right) {
    if (left == right) 
        tree[node] = array[left];
    else {
        int mid = (left + right) / 2;

        build(2 * node, left, mid);
        build(2 * node + 1, mid + 1, right);

        tree[node] = tree[node * 2] + tree[node * 2 + 1];
    }
    

}
void update(int node, int left, int right, int pos, int newValue) {
    if (left == right)
        tree[node] -= newValue;
    else {
        int mid = (left + right) / 2;

        if (pos <= mid) {
            update(2 * node, left, mid, pos, newValue);
        }
        else
            update(2 * node + 1, mid + 1, right, pos, newValue);

        tree[node] = tree[node * 2] + tree[node * 2 + 1];
    }
}

int query(int node, int left, int right, int ql, int qr) {
    if(ql <= left && right <= qr) {
        return tree[node];
    }
    else {
        int mid = (left + right) / 2;
        if (mid >= qr) 
            return query(2 * node, left, mid, ql, qr);
        if (mid + 1 <= ql)
            return query(2 * node + 1, mid + 1, right, ql, qr);
        return query(2 * node, left, mid, ql, qr) + query(node * 2 + 1, mid + 1, right, ql, qr);
    }
}
int main()
{
    
    int n, m;
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> array[i];
    }
    build(1, 1, n);
    int a, b, c;
    for (int i = 1; i <= m; i++) {
        fin >> a >> b >> c;
        if (a == 1) {
            fout << query(1, 1, n, b, c) << '\n';
        }
        else {
            update(1, 1, n, b, c);
        }
    }
    return 0;
}