Cod sursa(job #739794)

Utilizator veleanduAlex Velea veleandu Data 23 aprilie 2012 21:31:13
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
using namespace std;
#define maxn 100001

long i,n,m,Op,a,b;
long Ai[maxn];

void Push ( long ind, long val )
{
    long aux;
    while ( ind <= n )
    {
        Ai[ ind ]+=val;
        ind = ( ind | ( ind-1 ) ) + 1;
    }
}

long Search ( long ind )
{
    long rez = 0 ;
    while ( ind > 0 )
    {
        rez+=Ai[ind];
        ind&=( ind-1 );
    }
    return rez;
}

long Bs ( long val )
{
    long i,ind=0;
    for ( i=1; i<n; i<<=1 )
        ;
    for ( ; i; i>>=1 )
    {
        if ( ind+i<=n && Search ( ind+i ) <=val )
            ind+=i;
    }
    if ( val == Search ( ind ) )
        return ind;
    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);
        Push ( i,a );
    }
    for ( i=1; i<=m; i++ )
    {
        scanf ( "%d %d", &Op, &a );
        switch ( Op )
        {
            case 0:
                scanf ( "%d", &b);
                Push ( a,b );
            break;

            case 1:
                scanf ( "%d", &b);
                printf ( "%d\n", Search ( b ) - Search ( a-1 ) );
            break;

            case 2:
                printf ( "%d\n" , Bs (a) );
            break;
        }
    }
    return 0;
}