Cod sursa(job #1145819)

Utilizator tanduraDomnita Dan tandura Data 18 martie 2014 14:13:00
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
using namespace std;

int n,m;

vector<long long> arb;

void modificare(int poz,int val)
{
    int k=0;
    while(poz<=n)
    {
        arb[poz] += val;
        while(!(poz & (1<<k)))
            k++;
        poz += (1<<k);
        k++;
    }
}

long long suma(int poz)
{
    int k=0;
    long long s=0;
    while(poz>0)
    {
        s += arb[poz];
        while ( !(poz & (1<<k)) )
            k++;
        poz -= (1<<k);
        k++;
    }

    return s;
}

int Cautare(int val)
{
    int pas;

    for ( pas = 1; pas < n; pas <<= 1 );

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

int main()
{
    int t,a,b;

    ifstream f("aib.in");
    ofstream g("aib.out");

    f>>n>>m;
    arb.resize(n+1,0);

    for(int i=1;i<=n;i++)
    {
        f>>a;
        modificare(i,a);
    }

    for(int i=1;i<=m;i++)
    {
        f>>t;
        switch(t)
        {
            case 0:
            {
                f>>a>>b;
                modificare(a,b);
                break;
            };

            case 1:
            {
                f>>a>>b;
                g<<suma(b)-suma(a-1)<<"\n";
                break;
            };

            case 2:
            {
                f>>a;
                g<<Cautare(a)<<"\n";
                break;
            }
        }
    }
    return 0;
}