Pagini recente » Cod sursa (job #1293597) | Cod sursa (job #1457390) | Cod sursa (job #2945368) | Cod sursa (job #3151336) | Cod sursa (job #1756772)
#include <cstdio>
using namespace std;
#define NMAX 100005
int n, lg;
int v[ NMAX ];
int cauta( int k );
int suma( int x );
void add( int x, int y );
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int m, i, j, k, x, y;
scanf("%d%d",&n,&m);
for( i = 1; i <= n; ++i ){
scanf("%d",&k);
add( i, k );
}
k = n; lg = -1;
while( k ){
lg++;
k /= 2;
}
while( m-- ){
scanf("%d",&k);
if( k < 2 ){
scanf("%d%d",&x,&y);
if( !k ) add( x, y );
else printf("%d\n",suma( y ) - suma( x - 1 ) );
}
else{
scanf("%d",&x);
printf("%d\n",cauta( x ));
}
}
return 0;
}
void add( int x, int y ){
while( x <= n ){
v[ x ] += y;
x += ( x & ( -x ) );
}
}
int suma( int x ){
int s = 0;
while( x > 0 ){
s += v[ x ];
x -= ( x & ( -x ) );
}
return s;
}
int cauta( int k ){
int i, pas;
pas = 1 << ( lg + 1 ); i = 0;
while( pas ){
if( i + pas <= n && v[ i + pas ] <= k ){
k -= v[ i + pas ];
i += pas;
if( !k ) return i;
}
pas /= 2;
}
return -1;
}