Pagini recente » Cod sursa (job #2421940) | Cod sursa (job #2072525) | Cod sursa (job #2107842) | Cod sursa (job #1885928) | Cod sursa (job #1379548)
#include <fstream>
const int MAX_N(100001);
int Bit [MAX_N];
int n;
inline int Lsb (int x)
{
return x & -x;
}
inline void Update (int index, int val)
{
while (index <= n)
{
Bit[index] += val;
index += Lsb(index);
}
}
inline int Query (int index)
{
int result(0);
while (index)
{
result += Bit[index];
index -= Lsb(index);
}
return result;
}
int main (void)
{
std::ifstream input("aib.in");
int m, code, x, y;
input >> n >> m;
for (int i(1) ; i <= n ; ++i)
{
input >> x;
Update(i,x);
}
std::ofstream output("aib.out");
while (m)
{
input >> code;
if (code == 0 || code == 1)
input >> x >> y;
else
input >> x;
if (code == 0)
Update(x,y);
else if (code == 1)
output << Query(y) - Query(x - 1) << '\n';
else
{
int l(1), r(n), m((l + r) / 2), value(Query(m));
while (l < r && value != x)
{
if (value < x)
l = m + 1;
else
r = m - 1;
m = (l + r) / 2;
value = Query(m);
}
output << (value == x ? m : -1) << '\n';
}
--m;
}
return 0;
}