Cod sursa(job #3121036)

Utilizator unomMirel Costel unom Data 10 aprilie 2023 14:47:02
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");
int n, m;
int a[100005];

void update(int p, int val)
{
    for(int i = p; i<=n; i+=(i&-i))
    {
        a[i] += val;
    }
}

int query(int p)
{
    int suma = 0;
    for(int i = p; i>=1; i-=(i&-i))
    {
        suma += a[i];
    }
    return suma;
}

int main()
{
    f>>n>>m;
    int x;
    for(int i = 1; i<=n; i++)
    {
        f>>x;
        update(i, x);
    }

    int c, a, b;
    while(m--)
    {
        f>>c;
        if(c == 0)
        {
            f>>a>>b;
            update(a, b);
        }
        else if(c == 1)
        {
            f>>a>>b;
            g<<query(b) - query(a-1)<<'\n';
        }
        else if(c == 2)
        {
            f>>a;

            int st = 1;
            int dr = n;
            int ans = -1;
            int m;
            int sum;

            while(st <= dr)
            {
                m = (st + dr) / 2;

                sum = query(m);

                if(sum == a)
                {
                    ans = m;
                    dr = m - 1;
                }
                else if(sum > a)
                {
                    dr = m - 1;
                }
                else
                {
                    st = m + 1;
                }
            }

            g<<ans<<'\n';
        }
    }

    return 0;
}