Pagini recente » Cod sursa (job #1741202) | Cod sursa (job #36506) | Cod sursa (job #817287) | Cod sursa (job #1341227) | Cod sursa (job #213983)
Cod sursa(job #213983)
#include <cstdio>
int N, M;
int A[100005];
void update (int i, int val){
for (; i <= N; i += i ^ (i - 1) & i)
A[i] += val;
}
int query (int i){
int sum = 0;
for (; i; i -= i ^ (i - 1) & i)
sum += A[i];
return sum;
}
int search (int sum){
int step, i;
for (step = 1; step < N; step <<= 1);
for (i = 0; step; step >>= 1)
if (i + step <= N && A[i + step] <= sum){
i += step;
sum -= A[i];
}
return (!sum ? i : -1);
}
int main (){
freopen ("aib.in", "rt", stdin);
freopen ("aib.out", "wt", stdout);
int val;
scanf ("%d %d\n", &N, &M);
for (int i = 1; i <= N; ++ i)
scanf ("%d ", &val), update (i, val);
int a, b, c;
for (int i = 1; i <= M; ++ i){
scanf ("%d ", &c);
if (!c) scanf ("%d %d\n", &a, &b), update (a, b);
else if (c == 1) scanf ("%d %d\n", &a, &b), printf ("%d\n", query (b) - query (a-1));
else scanf ("%d\n", &a), printf ("%d\n", !a ? -1 : search (a)) ;
}
return 0;
}