Pagini recente » Cod sursa (job #3329066) | Cod sursa (job #3342741) | Cod sursa (job #3311346) | Cod sursa (job #807442) | Cod sursa (job #3357964)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 100005;
int n, m;
int aib[MAXN];
vector<int> v;
void update(int idx, int val) {
while (idx <= n) {
aib[idx] += val;
idx += idx & (-idx);
}
}
int query(int idx) {
int sum = 0;
while (idx > 0) {
sum += aib[idx];
idx -= idx & (-idx);
}
return sum;
}
int query_range(int l, int r) {
return query(r) - query(l-1);
}
int find_pos(int sum) {
int pos = 0;
int bitmask = 1;
while (bitmask < n) bitmask <<= 1;
for (; bitmask; bitmask >>= 1) {
int next_pos = pos + bitmask;
if (next_pos <= n && aib[next_pos] < sum) {
sum -= aib[next_pos];
pos = next_pos;
}
}
return pos + 1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
v.resize(n + 1);
for (int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
update(i, v[i]);
}
while (m--) {
int op;
scanf("%d", &op);
if (op == 0) {
int a, b;
scanf("%d %d", &a, &b);
update(a, b);
v[a] += b;
} else if (op == 1) {
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", query_range(a, b));
} else if (op == 2) {
int a;
scanf("%d", &a);
int low = 1, high = n, ans = -1;
while (low <= high) {
int mid = (low + high) / 2;
int s = query(mid);
if (s == a) {
ans = mid;
high = mid - 1;
} else if (s < a) {
low = mid + 1;
} else {
high = mid - 1;
}
}
printf("%d\n", ans);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}