Cod sursa(job #2912558)

Utilizator Andrei_ierdnANeculau Rares-Andrei Andrei_ierdnA 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;
}