Pagini recente » Cod sursa (job #489362) | Cod sursa (job #1915145) | Cod sursa (job #172050) | Cod sursa (job #1644836) | Cod sursa (job #954868)
Cod sursa(job #954868)
#include <cstdio>
using namespace std;
const long N = 100001;
long aib [N], n;
long lsb (long x){
return x & (-x);
}
void update (long x, long value){
long i;
for (i = x; i <= n; i += lsb (i))
aib [i] += value;
}
long query (long x){
long ans = 0;
while (x){
ans += aib [x];
x -= lsb (x);
}
return ans;
}
long Bs (long x){
long i, step, ans = 0, val;
step = 16;
val = x;
for (i = step - 1; i >= 0; i --)
if (ans + (1 << i) <= n)
if (aib [ans + (1 << i)] < x) {
ans += (1 << i);
x = x - aib [ans];
}
ans ++;
if (query (ans) == val)
return ans;
return -1;
}
int main (){
long m, i, a, t, b, ans, k;
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
scanf ("%ld%ld", &n, &m);
for (i = 1; i <= n; i ++){
scanf ("%ld", &a);
update (i, a);
}
for (i = 1; i <= m; i ++){
scanf ("%ld", &t);
if (t == 0){
scanf ("%ld%ld", &a, &b);
update (a, b);
}
if (t == 1){
scanf ("%ld%ld", &a, &b);
ans = query (b) - query (a - 1);
printf ("%ld\n", ans);
}
if (t == 2){
scanf ("%ld", &a);
k = Bs (a);
printf ("%ld\n", k);
}
}
return 0;
}