Pagini recente » Cod sursa (job #1713563) | Cod sursa (job #1240652) | Cod sursa (job #2873906) | Cod sursa (job #2963611) | Cod sursa (job #182256)
Cod sursa(job #182256)
#include <stdio.h>
#define NM 100001
int n, m, a[NM], c[NM];
int i, j, k, pos, o;
void Update(int pos, int val);
int Query(int pos);
int Search(int val);
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", &a[i]), Update(i, a[i]);
for ( k = 1; k <= m; k++ )
{
scanf("%d", &o);
if ( o == 0 ) scanf("%d %d", &i, &j), Update(i, j);
if ( o == 1 ) scanf("%d %d", &i, &j), printf("%d\n", Query(j) - Query(i-1));
if ( o == 2 ) scanf("%d", &i), printf("%d\n", Search(i));
}
return 0;
}
void Update(int pos, int val)
{
if ( pos > n ) return;
c[pos] += val;
int step = 1;
while ( !(step & pos) ) step *= 2;
Update(pos+step, val);
}
int Query(int pos)
{
if ( pos < 1 ) return 0;
int step = 1;
while ( !(step & pos) ) step *= 2;
return Query(pos-step) + c[pos];
}
int Search(int val)
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 )
if( i + step <= n )
if( val >= c[i+step] )
{
i += step, val -= c[i];
if ( !val ) return i;
}
return -1;
}