Pagini recente » Cod sursa (job #566063) | Cod sursa (job #3184783) | Cod sursa (job #1067959) | Cod sursa (job #190534) | Cod sursa (job #1408175)
#include <fstream>
#include <iostream>
const int MAX_N(100001);
int n;
int Bit [MAX_N];
inline int Lsb (int num)
{
return num & -num;
}
inline void BitUpdate (int index, int value)
{
while (index <= n)
{
Bit[index] += value;
index += Lsb(index);
}
}
inline int Query (int index)
{
int result(0);
while (index)
{
result += Bit[index];
index -= Lsb(index);
}
return result;
}
inline int Search (int value)
{
int index(0);
for (int i(16); value && i >= 0; --i)
if (index + (1 << i) <= n && Bit[index + (1 << i)] <= value)
{
index += (1 << i);
value -= Bit[index];
}
return (index && !value ? index : -1);
}
int main (void)
{
std::ifstream input("aib.in");
std::ofstream output("aib.out");
int m;
input >> n >> m;
for (int i(1), value; i <= n; ++i)
{
input >> value;
BitUpdate(i,value);
}
int q, x, y;
while (m--)
{
input >> q;
if (q == 0)
{
input >> x >> y;
BitUpdate(x,y);
}
else if (q == 1)
{
input >> x >> y;
output << Query(y) - Query(x - 1) << '\n';
}
else
{
input >> x;
output << Search(x) << '\n';
}
}
input.close();
output.close();
return 0;
}