Pagini recente » Cod sursa (job #965022) | Cod sursa (job #1451803) | Cod sursa (job #51137) | Cod sursa (job #2421488) | Cod sursa (job #699471)
Cod sursa(job #699471)
#include <cstdio>
#include <cstring>
#define NMAX 100005
#define LSB(x) (x&(-x))
int N, Q, i, x, St, Dr, M, Pos, Tip, A, B;
int AIB[NMAX];
inline void Update( int Pos, int Val )
{
for( int ii = Pos; ii <= N; ii += LSB(ii) )
AIB[ii] += Val;
}
inline int Query( int Pos )
{
int Rez = 0;
for( int ii = Pos; ii; ii -= LSB(ii) )
Rez += AIB[ii];
return Rez;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
memset( AIB, 0, sizeof(AIB) );
scanf("%d%d", &N, &Q );
for( i = 1; i <= N; ++i )
{
scanf("%d", &x );
Update( i, x );
}
for( ; Q--; )
{
scanf("%d", &Tip );
if( !Tip )
{
scanf("%d%d", &A, &B );
Update( A, B );
}
else if( Tip == 1 )
{
scanf("%d%d", &A, &B );
printf("%d\n", Query( B ) - Query( A-1 ) );
}
else
{
scanf("%d", &A );
St = 1, Dr = N;
Pos = -1;
while( St <= Dr )
{
M = St + ((Dr-St)>>1);
int Rez = Query( M );
if( Rez == A )
{
Pos = M;
break;
}
else if( Rez < A )
St = M + 1;
else
Dr = M - 1;
}
printf("%d\n", Pos );
}
}
return 0;
}