Cod sursa(job #2289511)

Utilizator max945Maxim C max945 Data 24 noiembrie 2018 18:23:02
Problema Datorii Scor 0
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");

int n, m;
int tree[100005];

void update(int nodeIndex, int start, int end, int idx, int value) {
    if (start == end) {
        tree[nodeIndex] += value;
    } else {
        int mid = (start + end) / 2;
        if (start <= idx and idx <= mid) {
            update(2*nodeIndex, start, mid, idx, value);
        } else {
            update(2*nodeIndex + 1, mid + 1, end, idx, value);
        }
        tree[nodeIndex] = tree[2*nodeIndex] + tree[2*nodeIndex + 1];
    }
}

int query(int nodeIndex, int start, int end, int l, int r) {
    if (r < start or end < l) {
        return 0;
    }
    if (l <= start and end <= r) {
        return tree[nodeIndex];
    }
    int mid = (start + end) / 2;
    return (query(2*nodeIndex, start, mid, l, r) + query(2*nodeIndex + 1, mid + 1, end, l, r));
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int temp;
        fin >> temp;
        update(1, 1, n, i, temp);
    }

    int cod;
    for (int i = 1; i <= m; i++) {
        fin >> cod;
        if (cod) {
            int p, q;
            fin >> p >> q;
            fout << query(1, 1, n, p, q) << endl;
        } else {
            int t, v;
            fin >> t >> v;
            update(1, 1, n, t, -v);
        }
    }
    return 0;
}