Cod sursa(job #513019)

Utilizator mraresMardare Rares mrares Data 14 decembrie 2010 22:25:05
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#define nmax 500

using namespace std;

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

int n, m;
int v[nmax];

void update(int poz, int val)
{
    int bit = 0;
    while(poz <= n)
    {
        v[poz] += val;
        while(!(poz & (1<<bit)))
            bit++;
        poz += (1<<bit);
        ++bit;
    }
}

int query(int val)
{
    int bit, suma;
    bit = suma = 0;
    while(val > 0)
    {
        suma += v[val];
        while(!(val & (1<<bit)))
            bit++;
        val -= (1<<bit);
        ++bit;
    }
    return suma;
}

int search(int val)
{
    int step, i;
    for(step = 1; step < n; step = step << 1);
    for(i = 0; step; step = step >> 1)
    {
        if(i + step <= n)
        {
            if( val >= v[i+step])
            {
                i += step;
                val -= v[i];
                if(!val) return i;
            }
        }
    }
    return -1;
}

int main()
{
    int i, x, a, b, caut;
    fin >> n >> m;
    for(i = 1; i <= n; ++i)
    {
        fin >> x;
        update(i, x);
    }
    for(i = 1; i <= m; ++i)
    {
        fin >> x;
        if(!x)
        {
            fin >> a >> b;
            update(a, b);
        }
        if(x == 1)
        {
            fin >> a >> b;
            fout << (query(b)-query(a-1)) << "\n";
        }
        if(x == 2)
        {
            fin >> caut;
            int rez = search(caut);
            fout << rez << "\n";
        }
        // else fout << binsearch(x) << "\n";
    }
    return 0;
}