Cod sursa(job #1380396)

Utilizator tudoras8tudoras8 tudoras8 Data 7 martie 2015 18:22:26
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <vector>

using namespace std;

#define MAXN 100010

class FenwickTree {
    public:
        FenwickTree(const int &size):
                size_(size),
                data_(size + 1, 0) {
        }
        void add(int where, int value) {
            for (; where <= size_; where += (where & -where)) {
                data_[where] += value;
            }
        }
        int query(int where) {
            int answer = 0;
            for (; where; where -= (where & -where)) {
                answer += data_[where];
            }
            return answer;
        }
    private:
        int size_;
        vector<int> data_;
};

int main()
{
    int n, m;
    cin.sync_with_stdio(false);
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    cin >> n >> m;
    FenwickTree T(n);
    int a, b;
    for (int i = 1; i <= n; i++) {
        cin >> a;
        T.add(i, a);
    }

    int op;
    while (m--) {
        cin >> op;
        if (op == 0) {
            cin >> a >> b;
            T.add(a, b);
        } else if (op == 1) {
            cin >> a >> b;
            cout << (T.query(max(1, b)) - T.query(max(1, a - 1))) << '\n';
        } else {
            cin >> a;
            int lo, hi, val;
            lo = 1;
            hi = n;
            while (lo < hi) {
                int mid = lo + (hi - lo) / 2;
                val = T.query(mid);
                if (val == a)
                    lo = hi = mid;
                else if (val < a)
                    lo = mid + 1;
                else
                    hi = mid;
            }
            cout << lo << '\n';
        }
    }

    return 0;
}