Cod sursa(job #1251116)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 28 octombrie 2014 22:50:23
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>

#define Nmax 100100

using namespace std;

int N;

class Aib {

    private:
        int Aib[Nmax];

    public:

        void update(int Node, int Value) {

            while(Node <= N) {
                Aib[Node] += Value;
                Node += (Node & -Node);
                }

        }

        int query(int Node) {

            int Sum = 0;

            while(Node > 0) {
                Sum += Aib[Node];
                Node -= (Node & -Node);
                }

            return Sum;

        }

        int sum(int A, int B) {

            return (query(B) - query(A - 1));

        }

        int search(int Sum) {

            int i, Step;

            for(Step = 1; Step < N; Step <<= 1);

            for(i = 0; Step; Step >>= 1)
                if(i + Step <= N && Aib[i + Step] <= Sum) {

                    i += Step;
                    Sum -= Aib[i];

                    if(Sum == 0)
                        return i;

                    }

            return -1;

        }

} A;

int main() {

    int i, a, b, x, type, M;
    ifstream in("aib.in");
    ofstream out("aib.out");

    in >> N >> M;

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

    while(M--) {

        in >> type >> a;

        switch(type) {

            case 0:
                in >> b;
                A.update(a, b);
                break;

            case 1:
                in >> b;
                out << A.sum(a, b) << '\n';
                break;

            case 2:
                out << A.search(a) << '\n';

            }


        }

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

    return 0;

}