Cod sursa(job #582232)

Utilizator BitOneSAlexandru BitOne Data 15 aprilie 2011 08:40:25
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011

using namespace std;
int aib[N_MAX];
void Update( int x, const int& y, const int& N )
{
    for( ; x <= N; x+=( x & -x ) )
        aib[x]+=y;
}
int Sum( int x )
{
    int sum=0;
    for( ; x; x-=( x & -x ) )
        sum+=aib[x];
    return sum;
}
inline int log2( int N ) { return 31-__builtin_clz(N); }
int Query( int log2N, int S, const int& N )
{
    int tidx, idx;
    for( idx=0; log2N; log2N>>=1 )
    {
        tidx=log2N+idx;
        if( tidx <= N )
        {
            if( S < aib[tidx] )
                continue;
            S-=aib[tidx];
            if( 0 == S )
                return tidx;
            idx=tidx;
        }
    }
    return -1;
}
int main( void )
{
    int N, logN, M, op, i, x;
    ifstream in( "aib.in" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
    {
        in>>x;
        Update( i, x, N );
    }
    logN=1<<log2(N);
    ofstream out( "aib.out" );
    for( ; M; --M )
    {
        in>>op;
        switch(op)
        {
            case 0 : in>>i>>x; Update( i, x, N ); break;
            case 1 : in>>i>>x; out<<( Sum(x)-Sum(i-1) )<<'\n'; break;
            case 2 : in>>i; out<<Query( logN, i, N )<<'\n';
        }
    }
    return EXIT_SUCCESS;
}