Pagini recente » Cod sursa (job #2525228) | Cod sursa (job #811967) | Cod sursa (job #1159298) | Cod sursa (job #1256635) | Cod sursa (job #1147590)
#include <cstdio>
#define zeros(x) ( (x ^ (x-1) ) & x )
#define SIZE 100002
using namespace std;
int n, m, v[SIZE];
inline void add(int pos, int value)
{
for(int i = pos; i <= n; i += zeros(i))
v[ i ] += value;
}
inline int query(int pos)
{
int sum = 0;
for(int i = pos; i >= 1; i -= zeros(i) )
sum += v[i];
return sum;
}
inline int search_val( int value )
{
int left = 1, right = n;
while( left <= right )
{
int middle = ( left + right ) >> 1;
int value_tmp = query( middle );
if( value_tmp == value )
return middle;
else if( value_tmp > value )
right = middle - 1;
else
left = middle + 1;
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i)
{
int value;
scanf("%d", &value);
add(i, value);
}
while( m-- )
{
int op;
scanf("%d", &op);
if( op < 2 )
{
int a, b;
scanf("%d%d", &a, &b);
if( !op )
add( a, b );
else
printf( "%d\n", query( b ) - query( a- 1 ) );
}
else
{
int value;
scanf("%d", &value);
printf("%d\n", search_val( value ) );
}
}
return 0;
}