Pagini recente » Cod sursa (job #298553) | Cod sursa (job #1299904) | Cod sursa (job #1559811) | Cod sursa (job #2656521) | Cod sursa (job #1393236)
#include <fstream>
using namespace std;
int aib[100002];
int n;
int zeros(int x)
{
return (x ^ (x-1)) & x;
}
void add(int pos, int val)
{
for (int i = pos; i <= n; i += zeros(i))
aib[i] += val;
}
int sum(int x)
{
int result = 0;
for (int i = x; i > 0; i -= zeros(i))
result += aib[i];
return result;
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
int m;
in >> n >> m;
for (int x, i = 1; i <= n; i++)
{
in >> x;
add(i, x);
}
int t, a, b;
while (m--)
{
in >> t;
if (t == 0)
{
in >> a >> b;
add(a, b);
}
else if (t == 1)
{
in >> a >> b;
out << sum(b) - sum(a-1) << '\n';
}
else
{
in >> a;
int step;
bool ok = false;
for (step = 1; step < n; step <<= 1);
for (int j = 0; step; step >>= 1)
{
if (j + step <= n)
{
if (aib[j+step] <= a)
{
a -= aib[j+step];
j += step;
if (a == 0)
{
out << j << '\n';
ok = true;
break;
}
}
}
}
if (!ok)
out << "-1\n";
}
}
return 0;
}