Cod sursa(job #1773033)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 7 octombrie 2016 14:43:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>

int n, aib[150005];

using namespace std;

void update( int p, int val )
{
    for( ; p<=n; p+=p&-p )
        aib[p]+=val;
}

int query( int p )
{
    int s=0;

    for( ; p>0; p-=p&-p )
        s=s+aib[p];

    return s;
}

int caut( int val )
{
    int i, poz;

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

    for( i=0; poz>0; poz/=2 )
    {
        if( i+poz<=n && aib[i+poz]<=val )
        {
            i+=poz;
            val-=aib[i];

            if( val==0 )
                return i;
        }
    }
    return -1;
}

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

    int m, op, a, b, i;

    scanf( "%d%d", &n, &m );

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

    for( i=1; i<=m; i++ )
    {
        scanf( "%d", &op );

        if( op==0 )
        {
            scanf( "%d%d", &a, &b );
            update(a,b);
        }
        else
            if( op==1 )
            {
                scanf( "%d%d", &a, &b );
                printf( "%d\n", query(b) - query(a-1) );
            }
            else
            {
                scanf( "%d", &a );
                printf( "%d\n", caut(a) );
            }
    }

    return 0;
}