Cod sursa(job #1329740)

Utilizator maribMarilena Bescuca marib Data 29 ianuarie 2015 20:10:09
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define DIM 100001
using namespace std;

int n, m, tip, op, val, p, p1, p2;

int arb[100001];

void update(int x, int nr)
{
    int nr0=0;
    while(x<=n)
    {
        nr0=0;
        arb[x]+=nr;
        while(! (x&(1<<nr0)) ) nr0++;
        x+=(1<<nr0);
    }
}

int calc(int x)
{
    int nr0=0, sum=0;
    while(x>0)
    {
        nr0=0;
        sum+=arb[x];
        while( !(x&(1<<nr0))) nr0++;
        x-=(1<<nr0);
    }
    return sum;
}

int look_for(int nr)
{
    int x=1;
    while(x < n )
    {
        x <<= 1;
    }
    int i=0;
    while( x )
    {
        if( i+x <= n)
        {
            if(arb[i+x] <= nr)
            {
                i+=x;
                nr-=arb[i];
                if(!nr) return i;
            }
        }
        x >>= 1;
    }
    if( nr ) return -1;
}

int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");
    in>>n>>op;
    for(int i=1; i<=n; ++i)
    {
        in>>val;
        update(i, val);
    }
    for(int i=1; i<=op; ++i)
    {
        in>>tip;
        if(!tip)
        {
            in>>p>>val;
            update(p, val);
        }
        else if(tip==1)
        {
            in>>p1>>p2;
            out<<calc(p2)-calc(p1-1)<<"\n";
        }
        else
        {
            in>>val;
            out<<look_for(val)<<"\n";
        }
    }
    in.close();
    out.close();
    return 0;
}