Pagini recente » Cod sursa (job #1369462) | Cod sursa (job #1517275) | Cod sursa (job #2917375) | Cod sursa (job #3147256) | Cod sursa (job #1383241)
#include <fstream>
#include <vector>
int search(std::vector<std::size_t> &v, std::size_t sum)
{
auto step = 1u;
for (; step < v.size(); step <<= 1)
;
auto i = 0u;
for (; step; step >>= 1)
if (i + step < v.size())
if (sum >= v[i + step]) {
i += step;
sum -= v[i];
if (!sum)
return i;
}
return -1;
}
std::size_t query(std::vector<std::size_t> &v, std::size_t pos)
{
auto sum = 0;
for (auto i = static_cast<int>(pos); i > 0; i -= (i & -i))
sum += v[i];
return sum;
}
void update(std::vector<std::size_t> &v, std::size_t elem, std::size_t pos)
{
for (auto i = pos; i < v.size(); i += (i & -i))
v[i] += elem;
}
int main()
{
std::ifstream fin{"aib.in"};
std::ofstream fout{"aib.out"};
std::size_t N, M;
fin >> N >> M;
std::vector<std::size_t> v(N + 1, 0);
for (auto i = 1u; i <= N; ++i) {
std::size_t elem;
fin >> elem;
update(v, elem, i);
}
while (M--) {
int type;
fin >> type;
if (type == 1 || !type) {
std::size_t a, b;
fin >> a >> b;
if (!type)
update(v, b, a);
else
fout << query(v, b) - query(v, a - 1) << '\n';
} else {
std::size_t c;
fin >> c;
fout << search(v, c) << '\n';
}
}
return 0;
}