Pagini recente » Cod sursa (job #735508) | Cod sursa (job #289175) | Cod sursa (job #1139093) | Cod sursa (job #2460460) | Cod sursa (job #1632390)
#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;
}