Cod sursa(job #947427)

Utilizator BitOneSAlexandru BitOne Data 7 mai 2013 14:34:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdlib>
#include <fstream>


using namespace std;

const int NMAX = 100011;

int aib[NMAX];

void Update(int pIndex, int pValue, int N)
{
    for(; pIndex <= N; pIndex += (pIndex & -pIndex))
        aib[pIndex] += pValue;
}

int Query(int index)
{
    int sum = 0;
    for(; index; index -= (index & -index))
        sum += aib[index];
    return sum;
}

inline int log2(int N)
{
#ifdef __GNUC__
    return 8 * sizeof(int) - 1 - __builtin_clz(N);
#else
    int count = -1;
    for(; N; N >>= 1, ++count);
    return count;
#endif // __GNUC__
}

int Search(int sum, int N)
{
    int idx, tIdx, toAdd;

    tIdx = toAdd = 0;
    for(idx = 1 << log2(N); idx; idx >>= 1)
    {
        tIdx = idx + toAdd;
        if(tIdx <= N)
        {
            if(sum == aib[tIdx]) return tIdx;
            if(sum > aib[tIdx])
            {
                sum -= aib[tIdx];
                toAdd = tIdx;
            }
        }
    }
    return -1;
}

int main()
{
    int N, M, i, x, op, a, b;
    ifstream in("aib.in");
    ofstream out("aib.out");

    in >> N >> M;
    for(i = 1; i <= N; ++i)
    {
        in >> x;
        Update(i, x, N);
    }
    for(; M; --M)
    {
        in >> op >> a;
        if(0 == op)
        {
            in >> b;
            Update(a, b, N);
        }
        else if(1 == op)
             {
                in >> b;
                out << (Query(b) - Query(a - 1)) << '\n';
             }
        else out << Search(a, N) << '\n';
    }

    return EXIT_SUCCESS;
}