Pagini recente » Cod sursa (job #2416075) | Cod sursa (job #2050807) | Cod sursa (job #1803587) | Cod sursa (job #315849) | Cod sursa (job #1110166)
#include <fstream>
#include <vector>
using namespace std;
class FenwickTree {
public:
FenwickTree(const int _size = 0):
size(_size),
tree(vector<int>(_size + 1, 0)) {}
void Update(int where, const int value) {
for (++where; where <= size; where += LSB(where))
tree[where] += value;
}
int QuerySum(const int from, const int to) const {
return QuerySum(to) - QuerySum(from - 1);
}
int QuerySum(int where) const {
int sum = 0;
for (++where; where > 0; where -= LSB(where))
sum += tree[where];
return sum;
}
int LowerBound(int value) {
int where = -1, step = 1;
for (; (step << 1) <= size; step <<= 1);
for (; step > 0; step >>= 1) {
if (where + step < size && tree[where + step + 1] < value) {
value -= tree[where + step + 1];
where += step;
}
}
return where + 1;
}
private:
int size;
vector<int> tree;
static int LSB(const int value) {
return value & (-value);
}
};
int main() {
ifstream cin("aib.in");
ofstream cout("aib.out");
int n, q;
cin >> n >> q;
FenwickTree tree = FenwickTree(n);
for (int i = 0; i < n; ++i) {
int value;
cin >> value;
tree.Update(i, value);
}
for (; q > 0; --q) {
int type;
cin >> type;
if (type == 0) {
int where, value;
cin >> where >> value;
tree.Update(--where, value);
} else if (type == 1) {
int from, to;
cin >> from >> to;
cout << tree.QuerySum(--from, --to) << "\n";
} else if (type == 2) {
int value;
cin >> value;
int where = tree.LowerBound(value);
if (tree.QuerySum(where) != value)
cout << "-1\n";
else
cout << where + 1 << "\n";
}
}
cin.close();
cout.close();
return 0;
}