Cod sursa(job #3143956)

Utilizator RaduNichitaRadu Nichita RaduNichita Data 3 august 2023 15:29:12
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

struct aib {

    std::vector<int> bit;
    int n;

    aib(std::vector<int> &v) {
        n = v.size();
        bit.resize(n + 1, 0);
        for (int i = 0; i < n; ++i) {
            update(i, v[i]);
        }

    }

    int64_t compute(int r) {
        if (r == -1) {
            return 0;
        }
        int64_t total_sum = 0;
        while (r >= 0) {
            total_sum += bit[r];
            r = r & (r + 1);
            r--;
        }
        return total_sum;
    }

    void update(int index, int value) {
        for (int start = index; start <= n; start = (start | (start + 1))) {
            bit[start] += value;
        }
    }

    int64_t query(int l, int r) {
        return compute(r) - compute(l);       
    }
};

int main() {
    std::ifstream in("datorii.in");
    std::ofstream out("datorii.out");

    int n, m;
    in >> n >> m;

    std::vector<int> v(n);

    for (int i = 0; i < n; ++i) {
        in >> v[i];
    }

    aib bit = aib(v);
    for (int i = 0; i < m; ++i) {
        int query;
        in >> query;
        if (query == 0) {
            int t, v;
            in >> t >> v;
            bit.update(t - 1, -v);
        } else if (query == 1) {
            int p, q;
            in >> p >> q;
            out << bit.query(p - 2, q - 1) << "\n";
        }
    }

    in.close();
    out.close();
    return 0;
}