Pagini recente » Cod sursa (job #1708523) | Cod sursa (job #1601579) | Cod sursa (job #1893062) | Cod sursa (job #2813472) | Cod sursa (job #3178459)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
class binaryindexedtree {
private:
vector<int> bit;
const int size;
public:
binaryindexedtree(const int auxsize) : bit(auxsize + 5, 0), size(auxsize) {}
int leastSignificantBit(int x) {
return (x & (-x));
}
void add(int index, int value) {
for (int i = index; i <= size; i += leastSignificantBit(i))
bit[i] += value;
}
int prefixSum(int index) {
int result = 0;
for (int i = index; i >= 1; i -= leastSignificantBit(i))
result += bit[i];
return result;
}
int findPosition(int sum) {
int left = 1, right = size, result = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (prefixSum(mid) >= sum) {
result = mid;
right = mid - 1;
}
else {
left = mid + 1;
}
}
return result;
}
};
int main() {
int n, m;
in >> n >> m;
binaryindexedtree bit(n);
for (int i = 1; i <= n; i++) {
int x;
in >> x;
bit.add(i, x);
}
for (int i = 1; i <= m; i++) {
int operation;
in >> operation;
if (operation == 0) {
int index, value;
in >> index >> value;
bit.add(index, value);
}
else if (operation == 1) {
int startIndex, endIndex;
in >> startIndex >> endIndex;
out << bit.prefixSum(endIndex) - bit.prefixSum(startIndex - 1) << '\n';
}
else if (operation == 2) {
int targetSum;
in >> targetSum;
out << bit.findPosition(targetSum) << '\n';
}
}
return 0;
}