Cod sursa(job #3254248)

Utilizator KRISTY06Mateiu Ianis Cristian Vasile KRISTY06 Data 6 noiembrie 2024 18:40:04
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int n, m, a[15001], tree[60001];

void update(int left, int right, int currentNode, int pos) {
    if (left == right) {
        tree[currentNode] = a[pos];
        return;
    } else if (left <= pos && pos <= (left + right) / 2) {
        update(left, (left + right) / 2, currentNode * 2, pos);
    } else {
        update((left + right) / 2 + 1, right, currentNode * 2 + 1, pos);
    }
    tree[currentNode] = tree[currentNode * 2] + tree[currentNode * 2 + 1];
}

void build(int left, int right, int currentNode) {
    if (left == right) {
        tree[currentNode] = a[left];
        update(1, n, 1, left);
        return;
    }
    build(left, (left + right) / 2, currentNode * 2);
    build((left + right) / 2 + 1, right, currentNode * 2 + 1);
}

int query(int left, int right, int currentNode, int startPos, int endPos) {
    if (startPos <= left && right <= endPos) {
        return tree[currentNode];
    } else if (endPos < left || right < startPos) {
        return 0;
    }
    return query(left, (left + right) / 2, currentNode * 2, startPos, endPos) + query((left + right) / 2 + 1, right, currentNode * 2 + 1, startPos, endPos);
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        fin >> a[i];
    }
    build(1, n, 1);
    for (int i = 1; i <= m; ++i) {
        int op;
        fin >> op;
        if (op == 0) {
            int t, v;
            fin >> t >> v;
            a[t] -= v;
            update(1, n, 1, t);
        } else {
            int p, q;
            fin >> p >> q;
            fout << query(1, n, 1, p, q) << '\n';
        }
    }
    return 0;
}