Cod sursa(job #773074)

Utilizator veleanduAlex Velea veleandu Data 31 iulie 2012 21:24:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
using namespace std;
#define maxn 100005

    long a,b,t,m,n,i;
    long aib[maxn];

    long aib_query ( long index )
    {
        long rez=0;
        while ( index )
        {
            rez += aib[index];
            index &= index-1;
        }
        return rez;
    }
    void aib_update ( long index, long val )
    {
        while ( index <= n )
        {
            aib[index] += val;
            index = ( index | (index-1 ) ) +1 ;
        }
    }

    long b_search ( long val )
    {
        if ( !val )
            return -1;
        long i=1,poz=0;
        for ( ; i<=n; i<<=1 )
            ;
        for ( ; i; i>>=1 )
            if ( poz+i <= n)
                if ( ( aib_query( poz+i ) <= val ) )
                    poz+=i;
        if ( aib_query ( poz ) == val )
            return poz;
        return -1;
    }

int main()
{
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);

    scanf ("%d %d", &n, &m);
    for ( i=1; i<=n; i++ )
    {
        scanf ("%d", &a);
        aib_update(i,a);
    }

    for ( ; m; m-- )
    {
        scanf ("%d", &t );
        if ( t == 0 )
        {
            scanf ("%d %d", &a, &b );
            aib_update ( a,b );
        }
        if ( t == 1 )
        {
            scanf ("%d %d", &a, &b );
            printf ("%d\n", (aib_query( b ) - aib_query( a-1 ) )  );
        }
        if ( t == 2 )
        {
            scanf ("%d ", &a );
            printf ("%d\n", b_search ( a ) );
        }
    }
    return 0;
}