Pagini recente » Cod sursa (job #2206591) | Cod sursa (job #2073459) | Cod sursa (job #1943079) | Cod sursa (job #1773033)
#include <cstdio>
int n, aib[150005];
using namespace std;
void update( int p, int val )
{
for( ; p<=n; p+=p&-p )
aib[p]+=val;
}
int query( int p )
{
int s=0;
for( ; p>0; p-=p&-p )
s=s+aib[p];
return s;
}
int caut( int val )
{
int i, poz;
for( poz=1; poz<n; poz<<=1 );
for( i=0; poz>0; poz/=2 )
{
if( i+poz<=n && aib[i+poz]<=val )
{
i+=poz;
val-=aib[i];
if( val==0 )
return i;
}
}
return -1;
}
int main()
{
freopen( "aib.in", "r", stdin );
freopen( "aib.out", "w", stdout );
int m, op, a, b, i;
scanf( "%d%d", &n, &m );
for( i=1; i<=n; i++ )
{
scanf( "%d", &a );
update(i,a);
}
for( i=1; i<=m; i++ )
{
scanf( "%d", &op );
if( op==0 )
{
scanf( "%d%d", &a, &b );
update(a,b);
}
else
if( op==1 )
{
scanf( "%d%d", &a, &b );
printf( "%d\n", query(b) - query(a-1) );
}
else
{
scanf( "%d", &a );
printf( "%d\n", caut(a) );
}
}
return 0;
}