Cod sursa(job #2107853)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 17 ianuarie 2018 19:17:32
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
using namespace std;

class BIT {
    public:
        BIT(const vector< int >& v) {
            size = v.size();
            data.resize(v.size() + 1);

            for (size_t i = 0; i < size; ++i)
                update((int)i + 1, v[i]);
        }

        void update(int pos, int val) {
            for (; pos <= size; pos += lsb(pos))
                data[pos] += val;
        }

        int query(int left, int right) {
            return query_single(right) - query_single(left - 1);
        }

    private:
        int lsb(int x) {
            return (x&(-x));
        }

        int query_single(int pos) {
            int res = 0;
            for (; pos; pos -= lsb(pos))
                res += data[pos];
            return res;
        }

        size_t size;
        vector< int > data;
};

void solve() {
    int N, M;
    cin >> N >> M;

    vector< int > v(N);
    for (auto& it : v)
        cin >> it;

    BIT bit(v);

    for (; M; --M) {
        int op;
        cin >> op;

        if (op == 0) {
            int pos, val;
            cin >> pos >> val;
            bit.update(pos, -val);
        }
        else {
            int left, right;
            cin >> left >> right;
            cout << bit.query(left, right) << '\n';
        }
    }
}

int main() {
    assert(freopen("datorii.in", "r", stdin));
    assert(freopen("datorii.out", "w", stdout));

    solve();

    return 0;
}