Pagini recente » Cod sursa (job #1032146) | Cod sursa (job #2815974) | Cod sursa (job #2151539) | Cod sursa (job #2296479) | Cod sursa (job #175751)
Cod sursa(job #175751)
#include <cstdio>
using namespace std;
#define last(x) (x&(-x))
#define MAX_N 100100
int A[MAX_N];
int a, b, n, i, t, c;
void update(int p, int x) {
for ( int i=p; i<=n; i += last(i) )
A[i] += x;
}
int sum(int p) {
int s = 0;
for ( int i=p; i; i -= last(i) )
s += A[i];
return s;
}
int strange(int x) {
int s = sum(n);
if ( s == x ) return n;
int p, tot, target=0;
for ( p=1; p<n; p<<=1 );
for ( tot=0; p; p>>=1 )
if ( tot+p<=n && target+A[tot+p] <= x )
tot += p, target += A[tot];
if ( target==x ) return tot;
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out","w",stdout);
scanf("%d %d", &n, &t);
for ( i=1; i<=n; ++i ) {
scanf("%d", &a);
update(i, a);
}
while ( t-- ) {
scanf("%d", &c);
switch ( c ) {
case 0:
scanf("%d %d", &a, &b);
update(a,b);
break;
case 1:
scanf("%d %d", &a, &b);
// fprintf(stderr, "%d %d\n", sum(b), sum(a-1));
printf("%d\n", sum(b)-sum(a-1));
break;
case 2:
scanf("%d", &a);
printf("%d\n", strange(a));
break;
}
}
return 0;
}