Cod sursa(job #1756772)

Utilizator din99danyMatei Daniel din99dany Data 13 septembrie 2016 17:08:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
using namespace std;

#define NMAX 100005

int n, lg;
int v[ NMAX ];

int cauta( int k );
int suma( int x );
void add( int x, int y );

int main()
{

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

    int m, i, j, k, x, y;

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

    k = n; lg = -1;
    while( k ){
        lg++;
        k /= 2;
    }

    while( m-- ){
        scanf("%d",&k);
        if( k < 2 ){
            scanf("%d%d",&x,&y);
            if( !k ) add( x, y );
            else printf("%d\n",suma( y ) - suma( x - 1 ) );
        }
        else{
            scanf("%d",&x);
            printf("%d\n",cauta( x ));
        }
    }

    return 0;

}

void add( int x, int y ){

    while( x <= n ){
        v[ x ] += y;
        x += ( x & ( -x ) );
    }

}

int suma( int x ){

    int s = 0;

    while( x > 0 ){
        s += v[ x ];
        x -= ( x & ( -x ) );
    }

    return s;

}

int cauta( int k ){

    int i, pas;
    pas = 1 << ( lg + 1 ); i = 0;

    while( pas ){
        if( i + pas <= n && v[ i + pas ] <= k ){
            k -= v[ i + pas ];
            i += pas;
            if( !k ) return i;
        }
        pas /= 2;
    }

    return -1;

}