Pagini recente » Cod sursa (job #3224952) | Cod sursa (job #2892183) | Cod sursa (job #226246) | Cod sursa (job #2851396) | Cod sursa (job #2020938)
#include <stdio.h>
#define MAX 100005
#define z(x) (x & (-x))
int n, m, t, x, y;
int v[MAX], a[MAX];
void u(int p, int v){
for(int i = p; i <= n; i += z(i))
a[i] += v;
}
int q(int x){
int s = 0;
while(x){
s += a[x];
x -= z(x);
}
return s;
}
int cb(int s){
int l = 1, r = n;
while(l <= r){
int m = (l + r) / 2;
int v = q(m);
if(v == s)
return m;
v < s ? (l = m + 1) : (r = m - 1);
}
return -1;
}
int main(){
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%d", &v[i]);
u(i, v[i]);
}
for(int i = 0; i < m; ++i){
scanf("%d%d", &t, &x);
if(t == 0){
scanf("%d", &y);
u(x, y);
}
else if(t == 1){
scanf("%d", &y);
printf("%d\n", q(y) - q(x - 1));
}
else
printf("%d\n", cb(x));
}
return 0;
}