Pagini recente » Cod sursa (job #521600) | Cod sursa (job #2517120) | Cod sursa (job #414881) | Cod sursa (job #2063415) | Cod sursa (job #2462682)
#include <bits/stdc++.h>
#define N 100005
#define z(i) (i)&(-i)
using namespace std;
int n, m, v[N], aib[N];
void update(int pos, int val) {
for (int i = pos; i <= n; i += z(i))
aib[i] += val;
}
int get(int pos) {
int res = 0;
for (int i = pos; i > 0; i -= z(i))
res += aib[i];
return res;
}
int find_pos(int sum) {
int width = 1;
while (width <= n) width <<= 1;
int pos = 0;
for (width >>= 1; width; width >>= 1)
if (pos + width <= n && aib[pos + width] <= sum) {
pos += width;
sum -= aib[pos];
}
return (!sum && pos) ? pos : -1;
}
int main() {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
scanf("%i%i", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%i", &v[i]);
update(i, v[i]);
}
int a, b, t;
while (m--) {
scanf("%i", &t);
switch (t) {
case 0:
scanf("%i%i", &a, &b);
update(a, b);
break;
case 1:
scanf("%i%i", &a, &b);
printf("%i\n", get(b) - get(a - 1));
break;
case 2:
scanf("%i", &a);
printf("%i\n", find_pos(a));
}
}
return 0;
}