Pagini recente » Cod sursa (job #540629) | Cod sursa (job #409710) | Cod sursa (job #942523) | Cod sursa (job #1102519) | Cod sursa (job #2226659)
#include <iostream>
#include <fstream>
#include <array>
#include <cstddef>
constexpr int NMAX = 100001;
std::array<int, NMAX> v;
int arraySize{ 0 };
std::ofstream g{ "aib.out" };
inline int bit(int i)
{
return i & (-i);
}
void UpdateBITree(int index, int value)
{
while(index <= arraySize) {
v[index] += value;
index += bit(index);
}
}
int GetSum(int index)
{
int sum{ 0 };
while(index > 0) {
sum += v[index];
index -= bit(index);
}
return sum;
}
int GetSumInterval(int lo, int hi)
{
return GetSum(hi) - GetSum(lo - 1);
}
enum QueryType : int
{
ADD = 0,
SUM = 1,
POSITION = 2
};
void Read()
{
std::ifstream f{ "aib.in" };
int numOfQuerries{ 0 };
int 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 };
int b{ 0 };
f >> a >> b;
UpdateBITree(a, b);
break;
}
case SUM:
{
int lo{ 0 };
int hi{ 0 };
f >> lo >> hi;
g << GetSumInterval(lo, hi) << '\n';
break;
}
case POSITION:
{
int 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();
}