Cod sursa(job #942185)

Utilizator BitOneSAlexandru BitOne Data 21 aprilie 2013 10:38:46
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdlib>
#include <fstream>

using namespace std;

const int NMAX = 100011;

int aib[NMAX];

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

int Sum(int i)
{
    int s = 0;
    for(; i; i -= (i & -i))
        s += aib[i];
    return s;
}

inline int log2(int N)
{
    int count = 0;
    for(; N; N >>= 1, ++count);
    return count - 1;
}

int Search(int key, int N)
{
    int idx, mIdx, tIdx;

    mIdx = tIdx = 0;
    for(idx = 1 << log2(N); idx; idx >>= 1)
    {
        tIdx = mIdx + idx;
        if(tIdx > N) continue;
        if(key == aib[tIdx]) return tIdx;
        if(key > aib[tIdx])
        {
            key -= aib[tIdx];
            mIdx = 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;
        if(0 == op)
        {
            in >> a >> b;
            Update(a, b, N);
        }
        else if(1 == op)
             {
                in >> a >> b;
                out << (Sum(b) - Sum(a - 1)) << '\n';
             }
        else {
                in >> a;
                out << Search(a, N) << '\n';
             }
    }

    return EXIT_SUCCESS;
}