Pagini recente » Cod sursa (job #296170) | Cod sursa (job #445035) | Cod sursa (job #1902175) | Cod sursa (job #199421) | Cod sursa (job #2817129)
#include <stdio.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
static inline int min( int a, int b ) {
return ( a <= b ? a : b );
}
static inline int max( int a, int b ) {
return ( a >= b ? a : b );
}
static inline int mod( int x ) {
return x < 0 ? -x : x;
}
FILE *fin;
int poz, valBuff;
static char buff[ ( 1 << 8 ) ];
static inline char nextChar() {
if( poz == valBuff ) {
fread( buff, 1, valBuff, fin );
poz = 0;
}
return buff[ poz++ ];
}
static bool f[ 100 ];
static inline int readInt() {
int rez = 0;
int ch;
while( !f[ ch = nextChar() ] );
do
rez = rez * 10 + ch - '0';
while( f[ ch = nextChar() ] );
return rez;
}
/////////////////////////////////////////////////////////////////////////////////////////////
#define val( a ) ( a & ( -a ) )
#define MAX 100000
int aib[ MAX + 1 ];
int n;
void make() {
for( int i = 1; i <= n; i++ ) {
aib[ i ] += readInt();
if( i + val( i ) <= n )
aib[ i + val( i ) ] += aib[ i ];
}
}
void update( int poz, int val ) {
while( poz <= n ) {
aib[ poz ] += val;
poz += val( poz );
}
}
int suma( int poz ) {
int rez = 0;
while( poz > 0 ) {
rez += aib[ poz ];
poz -= val( poz );
}
return rez;
}
int cauta( const int s ) { // am incercat sa fac cu Patrascu dar nu vrea :/
int left = 1, med;
int right = n, sol;
while( left <= right ) {
med = ( left + right ) >> 1;
if( suma( med ) >= s ) {
right = med - 1;
sol = med;
} else left = med + 1;
}
if( suma( sol ) == s )
return sol;
return -1;
}
int main()
{
f[ '0' ] = f[ '1' ] = f[ '2' ] = f[ '3' ] = f[ '4' ] = 1;
f[ '5' ] = f[ '6' ] = f[ '7' ] = f[ '8' ] = f[ '9' ] = 1;
valBuff = sizeof( buff );
fin = fopen( "aib.in", "r" );
fread( buff, 1, valBuff, fin );
n = readInt();
int q = readInt();
make();
int cerinta;
FILE *fout = fopen( "aib.out", "w" );
while( q-- ) {
cerinta = readInt();
if( cerinta == 2 )
fprintf( fout, "%d\n", cauta( readInt() ) );
else if( cerinta == 1 ) {
int a = readInt();
int b = readInt();
fprintf( fout, "%d\n", -suma( a - 1 ) + suma( b ) ); // nush dc nu merge
}
else {
int a = readInt();
int b = readInt();
update( a, b ); /// nush dc nu a mers sa sciu update( readInt(), readInt() ) ???
}
}
fclose( fin );
fclose( fout );
return 0;
}