Pagini recente » Borderou de evaluare (job #3365527) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #3365769) | Cod sursa (job #3365770)
#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++) {
tree[i] += v[i];
int j = i + (i & -i);
if (j <= n)
tree[j] += tree[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 position = 0;
int max_power = 1 << (31 - __builtin_clz(n));
for (int segment = max_power; segment; segment >>= 1) {
if (position + segment > n) continue;
if (tree[position + segment] > target) continue;
target -= tree[position + segment];
position += segment;
}
return (target == 0) ? position : -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() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
compute_input();
build_tree();
compute_output();
return 0;
}