Cod sursa(job #3282744)

Utilizator Edi17roAnghel Eduard Edi17ro Data 6 martie 2025 17:31:19
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 1e5;
int n, m;
int aib[NMAX + 5];

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

int query(int a)
{
    int s = 0;

    for(int i = a; i >= 1;)
    {
        s += aib[i];
        i -= (i & (-i));
    }

    return s;
}

int catare(int x)
{

    if(x == 0)
    {
        return -1;
    }

    int pos = 0;

    for(int step = 1 << 17; step > 0; step >>= 1)
    {
        if(pos + step <= n && aib[pos + step] <= x)
        {
            x -= aib[pos + step];
            pos += step;
        }
    }

    if(!x)
        return pos;
    else
        return -1;
}

int main()
{
    in >> n >> m;

    for(int i = 1; i <= n; ++i)
    {
        int x;
        in >> x;

        update(i, x);
    }

    for(int i = 1; i <= m; ++i)
    {
        int q, a, b;

        in >> q;

        if(q == 0)
        {
            in >> a >> b;

            update(a, b);
            continue;
        }

        if(q == 1)
        {
            in >> a >> b;

            int st = query(a - 1);
            int dr = query(b);

            out << dr - st << '\n';
            continue;
        }

        if(q == 2)
        {
            in >> a;

            out << catare(a) << '\n';
        }
    }

    return 0;
}

///BRUTE FORCE
/*
for(int i = 1; i <= m; ++i)
    {
        int q, a, b;
        int ans = 0;
        in >> q;

        switch(q)
        {
            case 0:
            {
                in >> a >> b;
                v[a] += b;
                break;
            }

            case 1:
            {
                in >> a >> b;
                  for(int i = a; i <= b; ++i)
                  {
                      ans += v[i];
                  }
                  out << ans << '\n';
                  break;
            }

            case 2:
            {
                in >> a;

                for(int i = 1; i <= n; ++i)
                {
                    ans += v[i];
                    if(ans == a)
                    {
                        out << i << '\n';
                        break;
                    }
                }
                if(ans != a)
                    out << -1 << '\n';
                break;
            }
        }
    }
*/