Cod sursa(job #2912557)

Utilizator Andrei_ierdnANeculau Rares-Andrei Andrei_ierdnA Data 9 iulie 2022 10:37:07
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 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)
        {
            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;
}