Pagini recente » Cod sursa (job #1068630) | Cod sursa (job #1086107) | Cod sursa (job #1068601) | Cod sursa (job #2707234) | Cod sursa (job #2929461)
#include <stdio.h>
#define NMAX 100000
int v[NMAX];
int n;
void form() {
int i, j;
for( i = 0; i < n; i++ ) {
j = i | ( i + 1 );
if( j <= n )
v[j] += v[i];
}
}
void increase( int poz, int dif ) {
for( ; poz < n; poz |= ( poz + 1 ) )
v[poz] += dif;
}
int calc( int poz ) {
int rez = 0;
for( ; poz >= 0; poz = ( poz & ( poz + 1 ) ) - 1 )
rez += v[poz];
return rez;
}
int sum( int left, int right ) {
return calc( right ) - calc( left - 1 );
}
int cb( int elem ) {
int st = -1, dr = n - 1, mijl;
while( dr - st > 1 ) {
mijl = ( st + dr ) / 2;
if( calc( mijl ) < elem )
st = mijl;
else
dr = mijl;
}
return dr;
}
int main() {
FILE *fin, *fout;
int m, i, a, b, tip;
fin = fopen( "aib.in", "r" );
fout = fopen( "aib.out", "w" );
fscanf( fin, "%d%d", &n, &m );
for( i = 0; i < n; i++ )
fscanf( fin, "%d", &v[i] );
form();
for( i = 0; i < m; i++ ) {
fscanf( fin, "%d", &tip );
if( tip == 0 ) {
fscanf( fin, "%d%d", &a, &b );
increase( a - 1, b );
}
else if( tip == 1 ) {
fscanf( fin, "%d%d", &a, &b );
fprintf( fout, "%d\n", sum( a - 1, b - 1 ) );
}
else {
fscanf( fin, "%d", &a );
fprintf( fout, "%d\n", cb( a ) + 1 );
}
}
fclose( fin );
fclose( fout );
return 0;
}