Pagini recente » Cod sursa (job #316555) | Cod sursa (job #1975241) | Cod sursa (job #600333) | Cod sursa (job #588135) | Cod sursa (job #2710998)
#include <stdio.h>
const int NMAX = 100'001;
int arr[NMAX], n, queries, bit[NMAX];
inline int lsb(int nr) {
return nr & -nr;
}
void update(int index, int value) {
for(int i = index;i <= n;i += lsb(i))
bit[i] += value;
}
int accumulate(int index) {
int ret{};
for(;index;index -= lsb(index))
ret += bit[index];
return ret;
}
int query2(int a) {
int left{ 1 }, right { n }, ret { -1 };
while(left <= right) {
int mid = (left + right) / 2,
s = accumulate(mid);
if(s == a) {
ret = mid;
right = mid - 1;
}else if(s < a)
left = mid + 1;
else
right = mid - 1;
}
return ret;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &n, &queries);
for(int i = 1;i <= n;++i) {
int x;
scanf("%d", &x);
update(i, x);
}
for(;queries--;) {
int type;
scanf("%d", &type);
if(type == 0) {
int ind, b;
scanf("%d%d", &ind, &b);
update(ind, b);
}else if(type == 1) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", accumulate(b) - accumulate(a - 1));
} else {
int a;
scanf("%d", &a);
printf("%d\n", query2(a));
}
}
return 0;
}