Cod sursa(job #1215874)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 2 august 2014 16:13:07
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <fstream>

class FenwickTree
{
private:
    int *myT;
    int size;
    int sum(int i)
    {
        int sum = 0;
        while (i >= 0)
        {
            sum += myT[i];
            i &= i + 1;
            i--;
        }
        return sum;
    }
public:
    void update(int i, int delta)
    {
        for (; i < size; i |= i + 1)
        {
            myT[i] += delta;
        }
    }
    int getSum(int left, int right)
    {
        return sum(right) - sum(left - 1);
    }
    int search(int val)
    {
        int ind = 1, i = -1;
        for (; ind < size; ind <<= 1);
        for (; ind; ind >>= 1)
        {
            if (i + ind < size)
            {
                if (val >= myT[i + ind])
                {
                    i += ind;
                    val -= myT[i];
                    if (val <= 0)
                    {
                        return i;
                    }
                }
            }
        }
        return -1;
    }
    FenwickTree(int *nArr, int nV) : myT(new int[nV]), size(nV)
    {
        for (int i = 0; i < nV; i++)
        {
            myT[i] = 0;
        }
        for (int i = 0; i < size; i++)
        {
            update(i, nArr[i]);
        }
    }
    ~FenwickTree()
    {
        delete[] myT;
    }
};

int main()
{
    std::ifstream in("aib.in");
    std::ofstream out("aib.out");
    int nV, nM;
    in >> nV >> nM;
    int *nArr = new int[nV];
    for (int i = 0; i < nV; i++)
    {
        in >> nArr[i];
    }
    FenwickTree myTree(nArr, nV);
    for (int i = 0; i < nM; i++)
    {
        int a, b, c;
        in >> c;
        if (c == 2)
        {
            in >> a;
            out << myTree.search(a) + 1 << '\n';
        }
        else
        {
            in >> a >> b;
            a--;
            if (!c)
            {
                myTree.update(a, b);
            }
            else
            {
                b--;
                out << myTree.getSum(a, b) << '\n';
            }
        }
    }
    in.close();
    out.close();
    return 0;
}