Pagini recente » Cod sursa (job #1926354) | Cod sursa (job #2622981) | Cod sursa (job #2140201) | Cod sursa (job #2586992) | Cod sursa (job #2226649)
#include <iostream>
#include <fstream>
#include <array>
#include <cstddef>
constexpr int NMAX = 100001;
std::array<int, NMAX> v;
std::size_t arraySize{ 0 };
std::ofstream g{ "aib.out" };
void UpdateBITree(std::size_t index, int value)
{
for(std::size_t i = index; i <= arraySize; i += i & (-i)) {
v[i] += value;
}
}
int GetSum(std::size_t index)
{
int sum{ 0 };
for(std::size_t i = index; i > 0; i -= i & (-i)) {
sum += v[i];
}
return sum;
}
int GetSumInterval(std::size_t lo, std::size_t hi)
{
return GetSum(hi) - GetSum(lo - 1);
}
enum QueryType : int
{
ADD = 0,
SUM = 1,
POSITION = 2
};
void Read()
{
std::ifstream f{ "aib.in" };
std::size_t numOfQuerries{ 0 };
std::size_t i{ 0 };
int operation{ -1 };
int number;
f >> arraySize >> numOfQuerries;
for(i = 1; i <= arraySize; ++i) {
f >> number;
UpdateBITree(i, number);
}
for(i = 1; i <= numOfQuerries; ++i) {
f >> operation;
switch(operation)
{
case ADD:
{
int a{ 0 }, b{ 0 };
f >> a >> b;
UpdateBITree(a, b);
break;
}
case SUM:
{
int lo{ 0 }, hi{ 0 };
f >> lo >> hi;
g << GetSumInterval(lo, hi) << '\n';
break;
}
case POSITION:
{
std::size_t k{ arraySize };
int a{ 0 };
bool found{ false };
f >> a;
while(!found) {
int s{ GetSum(k) };
if(s == a) {
while(GetSum(k - 1) == a) {
--k;
}
g << k << '\n';
found = true;
}
else if(s > a) {
k /= 2;
}
else {
k += k / 2;
}
}
break;
}
}
}
}
//void Solve()
//{
//}
int main()
{
Read();
// Solve();
}