Cod sursa(job #2912558)
Utilizator | Data | 9 iulie 2022 10:49:18 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 50 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.19 kb |
#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)
{
if (a == 0) {
g << 0 << '\n';
}
else
{
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;
}