Pagini recente » Cod sursa (job #2550641) | Cod sursa (job #3171583) | Cod sursa (job #33768) | Cod sursa (job #2324326) | Cod sursa (job #177236)
Cod sursa(job #177236)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define FIN "aib.in"
#define FOUT "ab.out"
#define NMAX 100001
FILE * fin, * fout;
int N, M, AIB[NMAX];
void update( int p, int value )
{
int i = p;
while ( i <= N )
{
AIB[i] += value;
i += ((i-1)^(i))&i;
}
}
int query( int left, int right )
{
int i, s1 = 0, s2 = 0;
i = left - 1;
while ( i > 0 )
{
s1 += AIB[i];
i -= ((i-1)^i)&i;
}
i = right;
while ( i > 0 )
{
s2 += AIB[i];
i -= ((i-1)^i)&i;
}
return s2 - s1;
}
int binary_search( int value )
{
int i = N, step = 1;
while ( step <= N ) step <<= 1;
while( step )
{
if( i - step > 0 && query( 1, i - step ) >= value )
i -= step;
step >>= 1;
}
if ( query( 1, i) != value )
return -1;
else
return i;
}
int main()
{
int i, type, X, Y;
fin = fopen( FIN, "r" );
fout = fopen( FOUT, "w" );
fscanf( fin, "%d%d", &N, &M );
for( i = 1; i <= N; i++ )
{
fscanf( fin, "%d", &X);
update( i, X );
}
while( M )
{
fscanf( fin, "%d", &type );
switch( type )
{
case 0 :
fscanf( fin, "%d%d", &X, &Y );
update( X, Y );
break;
case 1 :
fscanf( fin, "%d%d", &X, &Y );
fprintf( fout, "%d\n", query( X, Y) );
break;
case 2 :
fscanf( fin, "%d", &X );
fprintf( fout, "%d\n", binary_search( X ));
break;
};
M--;
}
fclose( fin );
fclose( fout );
return 0;
}