Cod sursa(job #1328938)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 28 ianuarie 2015 21:36:11
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
#include <cstring>

using namespace std;

class BinaryIndexedTree {

    private:
        int size, * tree;

        inline int lsb(int x) {
            return (x & (-x));
        }

    public:
        BinaryIndexedTree(int Size) {
            size = Size;
            tree = new int[size + 1];
            memset(tree, 0, sizeof(int) * (size + 1));
        }

        void update(int node, int value) {

            for(; node <= size; node += lsb(node))
                tree[node] += value;
        }

        int query(int node) {

            int result = 0;

            for(; node > 0; node -= lsb(node))
                result += tree[node];

            return result;
        }

        int sum(int a, int b) {
            return (query(b) - query(a - 1));
        }

        int search(int sum) {

            int i, step;

            for(step = 1; step < size; step <<= 1);

            for(i = 0; step; step >>= 1)
                if(i + step <= size && tree[i + step] <= sum) {
                    i += step;
                    sum -= tree[i];
                }

            if(sum == 0)
                return i;
            else
                return -1;
        }
};

int main() {

    int x, y, type, queries, N;

    ifstream in("aib.in");
    ofstream out("aib.out");

    in >> N >> queries;
    BinaryIndexedTree bit(N);

    for(int i = 1; i <= N; i++) {
        in >> x;
        bit.update(i, x);
    }

    while(queries--) {

        in >> type >> x;

        switch(type) {

            case 0:
                in >> y;
                bit.update(x, y);
                break;

            case 1:
                in >> y;
                out << bit.sum(x, y) << '\n';
                break;

            case 2:
                out << bit.search(x) << '\n';
        }
    }

    in.close();
    out.close();

    return 0;
}