Cod sursa(job #213636)

Utilizator recviemAlexandru Pana recviem Data 10 octombrie 2008 18:30:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#define step (k^(k-1))&k
#define nmax 100010

using namespace std;

int n,m,arb[nmax];
void update(int k,int val);
int sum(int k);
int query(int sum);

void citire()
{
    freopen("aib.in","r",stdin);
    scanf("%d %d",&n,&m);
    for (int i=0;i<n;i++)
    {
        int v;
        scanf("%d",&v);
        update(i+1,v);
    }
}

void main_loop()
{
    while (m)
    {
        int t,a,b;
        scanf("%d",&t);
        if ( !t )
        {
            scanf("%d %d",&a,&b);
            update(a,b);
        }
        if ( t == 1)
        {
            scanf("%d %d",&a,&b);
            printf("%d\n",sum(b)-sum(a-1));
        }
        if ( t == 2)
        {
            scanf("%d",&a);
            printf("%d\n",query(a));
            // do stuff
        }
        m--;
    }
}

int main()
{
    citire();
    freopen("aib.out","w",stdout);
    main_loop();
    return 0;
}

int query(int sum)
{
    int i, pas;

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

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

void update(int k, int val)
{
    while (k<=n)
    {
        arb[k] += val;
        k += step;
    }
}

int sum(int k)
{
    int res = 0;
    while (k>0)
    {
        res += arb[k];
        k -= step;
    }
    return res;
}