Pagini recente » Borderou de evaluare (job #3365527) | Cod sursa (job #3364862) | Cod sursa (job #3364983) | Cod sursa (job #3364433) | Cod sursa (job #3365324)
#include<bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 10;
typedef long long int ll;
ll tree[NMAX], v[NMAX];
int n, queries;
void compute_input() {
scanf("%d %d", &n, &queries);
for (int i = 1; i <= n; i++) scanf("%lld", &v[i]);
}
void add(int index, ll value) {
while (index <= n) {
tree[index] += value;
index = index + (index & -index);
}
}
void build_tree() {
for (int i = 1; i <= n; i++)
add(i, v[i]);
}
ll get_prefix(int index) {
if (index <= 0) return 0;
ll sum = 0;
while (index >= 1) {
sum += tree[index];
index = index - (index & -index);
}
return sum;
}
ll query(int left, int right) {
return get_prefix(right) - get_prefix(left - 1);
}
void update(int position, int new_value) {
add(position, new_value);
}
int order_sum(ll target) {
int left, right;
left = 1; right = n;
int result = 0;
while (left <= right) {
int middle = (left + right) / 2;
if (get_prefix(middle) >= target) {
result = middle;
right = middle - 1;
}
else
left = middle + 1;
}
return ((get_prefix(result) == target) ? result : -1);
}
void compute_output() {
for (; queries > 0; queries--) {
int op, x, y;
scanf("%d %d", &op, &x);
if (op == 1) {
scanf("%d", &y);
printf("%lld\n", query(x, y));
}
else if (op == 0) {
scanf("%d", &y);
update(x, y);
}
else {
printf("%d\n", order_sum(x));
}
}
}
int main() {
compute_input();
build_tree();
compute_output();
return 0;
}