Cod sursa(job #1131130)

Utilizator valiro21Valentin Rosca valiro21 Data 28 februarie 2014 18:00:40
Problema Arbori indexati binar Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>

#define NMax 100005

using namespace std;

long aib[NMax], n, m, a, b, bl, x;

void add ( long poz, long val ) {
    while ( poz < NMax ) {
        aib[poz] += val;
        poz += poz & ( -poz );
    }
}

long sum ( long poz ) {
    long sum = 0;
    while ( poz ) {
        sum += aib[poz];
        poz -= poz & ( -poz );
    }

    return sum;
}

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

    scanf ( "%ld %ld", &n, &m );
    for ( long i = 1; i <= n; i++ ) {
        scanf ( "%ld", &x );
        add ( i, x );
    }

    for ( long i = 1; i <= m; i++ ) {
        scanf ( "%ld", &bl );
        if ( bl < 2 ) {
            scanf ( "%ld %ld", &a, &b );
            if ( bl == 0 )
                add ( a, b );
            else
                printf ( "%ld\n", sum ( b ) - sum ( a - 1 ) );
        }
        else {
            scanf ( "%ld", &a );

            long ia = 1, ib = n, middle, returnVal = 0, S;
            while ( !returnVal ) {
                middle = ia + ( ib - ia ) / 2;
                S = sum ( middle );

                if ( middle == ia && S != a)
                    returnVal = -1;
                else if ( a < S )
                    ib = middle;
                else if ( a == S )
                    returnVal = middle;
                else
                    ia = middle;
            }

            printf ( "%ld\n", returnVal );
        }
    }

    return 0;
}