Pagini recente » Cod sursa (job #563193) | Cod sursa (job #916142) | Cod sursa (job #2809353) | Cod sursa (job #590266) | Cod sursa (job #1190360)
#include <stdio.h>
#define N_MAX 100000
int aib[ N_MAX + 1 ];
inline int ultb ( int x ){
return x & ( -x );
}
inline int suma( int poz ){
int sum = 0;
while ( poz > 0 ){
sum += aib[ poz ];
poz -= ultb( poz );
}
return sum;
}
inline void adaug ( int val, int poz, int n ){
while( poz <= n ){
aib[ poz ] += val;
poz += ultb ( poz );
}
return ;
}
int main()
{
FILE *in = fopen ( "aib.in", "r" );
int n, m;
fscanf ( in, "%d%d", &n, &m );
int i, nr;
for ( i = 1; i <= n; i++ ){
fscanf ( in, "%d", &nr );
adaug ( nr, i, n );
}
int tip, a, b;
FILE *out = fopen ( "aib.out", "w" );
for ( i = 1; i <= m; i++ ){
fscanf ( in, "%d", &tip );
if ( tip == 0 ){
fscanf ( in, "%d%d", &a, &b );
adaug ( b, a, n );
}
else if ( tip == 1 ){
fscanf ( in, "%d%d", &a, &b );
fprintf ( out, "%d\n", suma ( b ) - suma( a - 1 ) );
}
else{
fscanf ( in, "%d", &a );
int poz = 0, pas = 1 << 16;
while ( pas > 0 ){
if ( poz + pas <= n && suma ( poz + pas ) <= a ){
poz += pas;
}
pas >>= 1;
}
if ( suma ( poz ) == a ) fprintf ( out, "%d\n", poz );
else fprintf ( out, "-1\n" );
}
}
fclose ( in );
fclose ( out );
return 0;
}