Pagini recente » Cod sursa (job #2757923) | Cod sursa (job #1603711) | Cod sursa (job #1834292) | Cod sursa (job #1287063) | Cod sursa (job #2553113)
#include <stdio.h>
#define MAX 100005
#define zeros(x) (x ^ (x - 1) & x)
int n, m, x, a, b;
int aib[MAX];
void add(int *aib, int pos, int val) {
for (int i = pos; i <= n; i += zeros(i))
aib[i] += val;
}
int sum(int *aib, int pos) {
int res = 0;
for (int i = pos; i > 0; i -= zeros(i))
res += aib[i];
return res;
}
int get_sum_pos(int *aib, int val) {
int l = 1, r = n, mid, sum_val;
while (l <= r) {
mid = (l + r) / 2;
sum_val = sum(aib, mid);
if (sum_val == val)
return mid;
if (sum_val > val)
r = mid - 1;
else
l = mid + 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", &x);
add(aib, i, x);
}
for (int i = 0; i < m; ++i) {
scanf("%d", &x);
switch (x) {
case 0: {
scanf("%d%d", &a, &b);
add(aib, a, b);
} break;
case 1: {
scanf("%d%d", &a, &b);
printf("%d\n", sum(aib, b) - sum(aib, a - 1));
} break;
case 2: {
scanf("%d", &a);
printf("%d\n", get_sum_pos(aib, a));
}
}
}
return 0;
}