Pagini recente » Cod sursa (job #1057232) | Cod sursa (job #302509) | Cod sursa (job #2057896) | Cod sursa (job #2156825) | Cod sursa (job #2912557)
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
long long n, m, aib[100100], s[100100], i, j, cnt, cod, a, b, s1, s2, sol;
int main()
{
f >> n >> m;
for (i = 1; i <= n; i++)
{
f >> s[i];
s[i] += s[i-1];
}
for (i = 1; i <= n; i++)
{
aib[i] = s[i] - s[(i&(i-1))];
}
for (cnt = 1; cnt <= m; cnt++)
{
f >> cod >> a;
if (cod == 0)
{
f >> b;
for (j = a; j <= n; j = j + ((j ^ (j-1)) & j))
{
aib[j] += b;
}
}
else if (cod == 1)
{
f >> b;
s1 = s2 = 0;
for (j = b; j > 0; j = (j & (j-1)))
{
s1 = s1 + aib[j];
}
for (j = a-1; j > 0; j = (j & (j-1)))
{
s2 = s2 + aib[j];
}
g << s1-s2 << '\n';
}
else if (cod == 2)
{
sol = 0;
i = 1;
while (i <= n)
i <<= 1;
i >>= 1;
while (i)
{
if (sol+i <= n)
{
s1 = 0;
for (j = sol+i; j > 0; j = (j & (j-1)))
{
s1 = s1 + aib[j];
}
if (s1 <= a)
{
sol = sol + i;
}
}
i >>= 1;
}
s1 = 0;
for (j = sol; j > 0; j = (j & (j-1))) {
s1 = s1 + aib[j];
}
if (s1 == a) {
g << sol;
}
else {
g << -1;
}
g << '\n';
}
}
f.close();
g.close();
return 0;
}