Pagini recente » Cod sursa (job #722718) | Cod sursa (job #2738288) | Cod sursa (job #275053) | Cod sursa (job #2867898) | Cod sursa (job #1463497)
#include<cstdio>
using namespace std;
int aib[100005], n;
void update(int poz, int val) {
while (poz <= n) {
aib[poz] += val;
poz += poz & -poz;
}
}
int query(int poz) {
int sum = 0;
while (poz > 0) {
sum += aib[poz];
poz -= poz & -poz;
}
return sum;
}
int solve(int val) {
int step = 1, ans = 0;
while (step * 2 <= n) {
step *= 2;
}
while (step >= 1) {
if (ans + step <= n && aib[ans + step] <= val) {
val -= aib[ans + step];
ans += step;
}
step /= 2;
}
if (val != 0) ans = -1;
return ans;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int i, m, type, a, b;
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++) {
scanf("%d", &a);
update(i + 1, a);
}
for (i = 0; i < m; i++) {
scanf("%d", &type);
if (type == 0) {
scanf("%d %d", &a, &b);
update(a, b);
} else {
if (type == 1) {
scanf("%d %d", &a, &b);
printf("%d\n", query(b) - query(a-1));
} else {
scanf("%d", &a);
printf("%d\n", solve(a));
}
}
}
}