Pagini recente » Cod sursa (job #3204559) | Cod sursa (job #2094704) | Cod sursa (job #2829319) | Cod sursa (job #2624971) | Cod sursa (job #334684)
Cod sursa(job #334684)
#include<cstdio>
#define MAXN 100001
int i ,j , N , M , Tree[MAXN] , type , Sum , a , b , X;
int bits ( int X ) {
return ( X & ( X - 1 ) ^ X );
}
void update ( int poz , int value ) {
while ( poz <= N ) {
Tree[poz] += value;
poz += ( bits ( poz ) ) ;
}
}
int query ( int a ) {
int poz = a , Result = 0;
while ( poz > 0) {
Result += Tree[poz];
poz -= bits ( poz ) ;
}
return Result;
}
int query2 ( int Sum ) {
int left = 1 , right = N , mid , last = -1;
while ( left <= right ) {
mid = ( left + right ) >> 1;
if( query( mid ) == Sum ) last = mid , right = mid - 1;
else if ( query ( mid ) < Sum ) left = mid + 1;
else if ( query ( mid ) > Sum ) right = mid - 1;
}
return last;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&N , &M);
for( i = 1 ; i <= N ; ++i ) {
scanf("%d",&X);
update ( i , X );
}
for ( ; M -- ; ) {
scanf("%d",& type );
if ( type == 2 ) {
scanf("%d",&Sum);
printf("%d\n",query2 (Sum) );
}
else {
if ( type == 0 ) {
scanf("%d %d ",&a ,&b );
update( a , b );
}
else {
scanf("%d %d",&a ,&b);
printf("%d\n", query(b) - query ( a - 1 ) );
}
}
}
return 0;
}