Pagini recente » Cod sursa (job #3184780) | Cod sursa (job #2456715) | Cod sursa (job #3181492) | Cod sursa (job #1250226) | Cod sursa (job #3178451)
#include <cstdio>
#include <vector>
using namespace std;
class BinaryIndexedTree {
private:
vector<int> bit;
const int size;
public:
BinaryIndexedTree(const int auxsize) : bit(auxsize + 5, 0), size(auxsize) {}
int ub(int x) {
return (x & (-x));
}
void add(int x, int y) {
for (int i = x; i <= size; i += ub(i))
bit[i] += y;
}
int sum(int x) {
int rez = 0;
for (int i = x; i >= 1; i -= ub(i))
rez += bit[i];
return rez;
}
};
int main() {
int n, m;
scanf("%d %d", &n, &m);
BinaryIndexedTree bit(n);
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
bit.add(i, x);
}
for (int i = 1; i <= m; i++) {
int c;
scanf("%d", &c);
if (c == 0) {
int index, val;
scanf("%d %d", &index, &val);
bit.add(index, val);
} else if (c == 1) {
int i1, i2;
scanf("%d %d", &i1, &i2);
printf("%d\n", bit.sum(i2) - bit.sum(i1 - 1));
} else if (c == 2) {
int suma;
scanf("%d", &suma);
int left = 1, right = n, result = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (bit.sum(mid) >= suma) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
printf("%d\n", result);
}
}
return 0;
}