Cod sursa(job #1110166)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 17 februarie 2014 21:08:47
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <vector>

using namespace std;

class FenwickTree {
  public:
    FenwickTree(const int _size = 0):
      size(_size),
      tree(vector<int>(_size + 1, 0)) {}

    void Update(int where, const int value) {
        for (++where; where <= size; where += LSB(where))
            tree[where] += value;
    }

    int QuerySum(const int from, const int to) const {
        return QuerySum(to) - QuerySum(from - 1);
    }

    int QuerySum(int where) const {
        int sum = 0;
        for (++where; where > 0; where -= LSB(where))
            sum += tree[where];
        return sum;
    }

    int LowerBound(int value) {
        int where = -1, step = 1;
        for (; (step << 1) <= size; step <<= 1);
        for (; step > 0; step >>= 1) {
            if (where + step < size && tree[where + step + 1] < value) {
                value -= tree[where + step + 1];
                where += step;
            }
        }
        return where + 1;
    }

  private:
    int size;
    vector<int> tree;

    static int LSB(const int value) {
        return value & (-value);
    }
};

int main() {
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int n, q;
    cin >> n >> q;
    FenwickTree tree = FenwickTree(n);
    for (int i = 0; i < n; ++i) {
        int value;
        cin >> value;
        tree.Update(i, value);
    }
    for (; q > 0; --q) {
        int type;
        cin >> type;
        if (type == 0) {
            int where, value;
            cin >> where >> value;
            tree.Update(--where, value);
        } else if (type == 1) {
            int from, to;
            cin >> from >> to;
            cout << tree.QuerySum(--from, --to) << "\n";
        } else if (type == 2) {
            int value;
            cin >> value;
            int where = tree.LowerBound(value);
            if (tree.QuerySum(where) != value)
                cout << "-1\n";
            else
                cout << where + 1 << "\n";
        }
    }
    cin.close();
    cout.close();
    return 0;
}