Cod sursa(job #1131169)

Utilizator valiro21Valentin Rosca valiro21 Data 28 februarie 2014 18:15:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 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;
}

long bfind ( long left, long right, long s ) {
    long middle, S;
    if ( s < sum ( left ) || sum ( right ) < s )
        return -1;

    while ( left <= right ) {
        middle = left + ( right - left ) / 2;
        S = sum ( middle );

        if ( S == s )
            return middle;
        else if ( s < S )
            right = middle - 1;
        else
            left = middle + 1;
    }

    return -1;
}

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 );
            printf ( "%ld\n", bfind ( 1, n, a ) );
        }
    }

    return 0;
}