Pagini recente » Cod sursa (job #226539) | Cod sursa (job #1577015) | Cod sursa (job #1770796) | Cod sursa (job #1072146) | Cod sursa (job #2285052)
#include <fstream>
#include <vector>
using namespace std;
int Lsb(int num)
{
return num & -num;
}
void Add(vector<int> &bit, int pos, int val)
{
while (pos < (int)bit.size()) {
bit[pos] += val;
pos += Lsb(pos);
}
}
int Sum(const vector<int> &bit, int pos)
{
auto sum = 0;
while (pos > 0) {
sum += bit[pos];
pos -= Lsb(pos);
}
return sum;
}
int FindSumPos(const vector<int> &bit, int sum)
{
auto pos = -1;
auto power = (1 << 25);
while (power > 0) {
auto next_pos = pos + power;
power >>= 1;
if (next_pos < (int)bit.size() && Sum(bit, next_pos) < sum) {
pos = next_pos;
}
}
pos += 1;
return (pos < (int)bit.size() && Sum(bit, pos) == sum) ? pos : -1;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
int nums, queries;
fin >> nums >> queries;
vector<int> bit(nums + 1, 0);
for (int i = 0; i < nums; i += 1) {
int val;
fin >> val;
Add(bit, i + 1, val);
}
for (int i = 0; i < queries; i += 1) {
int type, a, b;
fin >> type;
if (type == 0) {
fin >> a >> b;
Add(bit, a, b);
} else if (type == 1) {
fin >> a >> b;
fout << Sum(bit, b) - Sum(bit, a - 1) << "\n";
} else {
fin >> a;
fout << FindSumPos(bit, a) << "\n";
}
}
return 0;
}