Pagini recente » Cod sursa (job #957799) | Cod sursa (job #3218268) | Cod sursa (job #2533836) | Borderou de evaluare (job #693670) | Cod sursa (job #1921209)
#include <bits/stdc++.h>
#define NMAX 100100
using namespace std ;
ofstream fout ( "aib.out" ) ;
int Arb[NMAX], N, M ;
void Update ( int pos, int value )
{
for ( int i = pos ; i <= N ; i += ( i & (-i) ) )
Arb[i] += value ;
}
int Query ( int pos )
{
int sum = 0 ;
for ( int i = pos ; i > 0 ; i -= ( i & (-i) ) )
sum += Arb[i] ;
return sum ;
}
int Search ( int value )
{
int step ;
for ( step = 1 ; step < N ; step <<= 1 ) ;
for ( int i = 0 ; step ; step >>= 1 )
if ( i + step <= N && value >= Arb[i + step] )
{
i += step, value -= Arb[i] ;
if ( !value ) return i ;
}
return -1 ;
}
void read()
{
int x, y, op ;
freopen ( "aib.in", "r", stdin ) ;
scanf ( "%d %d", &N, &M ) ;
for ( int i = 1 ; i <= N ; i++ )
scanf ( "%d", &x ), Update( i, x ) ;
for ( int i = 1 ; i <= M ; i++ )
{
scanf ( "%d", &op ) ;
if ( op == 0 )
scanf ( "%d %d", &x, &y ), Update( x, y ) ;
if ( op == 1 )
scanf ( "%d %d", &x, &y ), fout << Query(y) - Query(x - 1) << '\n' ;
if ( op == 2 )
scanf ( "%d", &x), fout << Search(x) << '\n' ;
}
}
int main()
{
read() ;
return 0 ;
}