Pagini recente » Cod sursa (job #2027103) | Cod sursa (job #2768058) | Cod sursa (job #2738388) | Cod sursa (job #2580538) | Cod sursa (job #2226683)
#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);
}
int BinarySearch(int left, int right, const int val)
{
if(left > right) {
return -1;
}
int mid{ left + (right - left) / 2 };
int sum{ GetSum(mid) };
if(sum > val) {
return BinarySearch(left, mid - 1, val);
}
else if(sum < val) {
return BinarySearch(mid + 1, right, val);
}
else {
return mid;
}
}
int Search(int a)
{
return BinarySearch(1, arraySize, a);
}
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 a{};
f >> a;
g << Search(a) << '\n';
break;
}
}
}
}
//void Solve()
//{
//}
int main()
{
Read();
// Solve();
}