Cod sursa(job #1632390)

Utilizator DysKodeTurturica Razvan DysKode Data 6 martie 2016 09:07:06
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <cstdio>

using namespace std;

FILE *fin = fopen( "aib.in" , "r" );
FILE *fout = fopen( "aib.out" , "w" );

int aib[100010],i,j,n,m,q,x;

__attribute__((always_inline)) int zero( int );
int zero( int x )
{
    return ( x & (-x) );
}

__attribute__((always_inline)) void apdeit( int , int );
void apdeit( int pos, int val )
{
    int i;
    for( i = pos ; i <= n ; i += zero( i ) )
    {
        aib[ i ] += val;
    }
}

__attribute__((always_inline)) int cueri( int );
int cueri( int x )
{
    int i,ans=0;
    for( i = x ; i > 0 ; i -= zero( i ) )
    {
        ans += aib[ i ];
    }
    return ans;
}

__attribute__((always_inline)) int sarci( int );
int sarci( int x )
{
    int i,step;
    for( step = 1 ; step <= n ; step <<= 1);
    for( i = 0 ; step ; step>>=1 )
    {
        if( i + step <= n && aib[ i + step ] <= x )
        {
            x -= aib[ i + step ];
            i += step;
            if( x == 0 )
                return i;
        }
    }
    return -1;
}

int main()
{
    fscanf( fin , "%d %d" , &n , &m );
    for( i = 1 ; i <= n ; i++ )
    {
        fscanf( fin , "%d" , &x );
        apdeit( i , x );
    }
    for( i = 1 ; i <= m ; i++ )
    {
        fscanf( fin , "%d" , &q );
        if( q == 0 )
        {
            fscanf( fin , "%d %d" , &q , &x );
            apdeit( q , x );
        }
        else if( q == 1 )
        {
            fscanf( fin , "%d %d" , &q , &x );
            x = cueri( x );
            q = cueri( q - 1 );
            fprintf( fout , "%d\n" , x - q );
        }
        else if( q == 2 )
        {
            fscanf( fin , "%d" , &x );
            x = sarci( x );
            fprintf( fout , "%d\n" , x );
        }
    }

return 0;
}