Pagini recente » Cod sursa (job #2908596) | Cod sursa (job #1474339) | Cod sursa (job #1383970) | Cod sursa (job #1463805) | Cod sursa (job #2206093)
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class BIT {
public:
vector<int> arr;
BIT(int n) {
arr.resize(n+1); // we start at index 1 .. n
}
void update (int i, int delta) {
int n = arr.size();
while (i < n) {
arr[i] += delta;
i += (i & -i);
}
}
// computes prefix sum at [1 .. i]
int prefix_sum (int i) {
int sum = 0;
while (i > 0) {
sum += arr[i];
i -= (i & -i);
}
return sum;
}
// computes range sum at [i .. j]
int range_sum (int i, int j) {
return prefix_sum(j) - prefix_sum(i-1);
}
};
int op2 (BIT& bit, int a) {
// we need to do the binary search directly on the bit.
int max_stepsize = 1;
int n = bit.arr.size();
while (max_stepsize < n) {
max_stepsize <<= 1;
}
int k = 0;
int j;
for (int step_size = max_stepsize; step_size > 0; step_size >>= 1) {
j = k+step_size;
if (j < n && bit.arr[j] <= a) {
a -= bit.arr[j];
k += step_size;
}
if (a == 0) {
return k;
}
}
return -1;
}
int main () {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int n,m;
cin >> n >> m;
BIT bit(n);
int val, c, a, b;
for (int i=0; i<n; ++i) {
cin >> val;
bit.update(i+1, val);
}
for (int i=0; i<m; ++i) {
cin >> c;
if (c == 0) {
cin >> a >> b;
bit.update(a,b);
}
else if (c == 1) {
cin >> a >> b;
cout << bit.range_sum(a,b) << endl;
}
else {
cin >> a;
cout << op2 (bit, a) << endl;
}
}
return 0;
}