Cod sursa(job #3249854)

Utilizator dianaionicaDiana Ionica dianaionica Data 18 octombrie 2024 12:33:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>

using namespace std;

int n, m, tip, a, b, k, mij;

int bit[100005], v[100005];

int query(int i)
{
    int sum = 0;
    while(i > 0)
    {
        sum += bit[i];
        i -= (i & -i);
    }
    return sum;
}

void update(int i, int val)
{
    while(i <= n)
    {
        bit[i] += val;
        i += (i & -i);
    }
}

int range_query(int l, int r)
{
    return query(r) - query(l - 1);
}
int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");

    cin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        cin >> v[i];
        update(i, v[i]);
    }

    for(int i = 1; i <= m; i++)
    {
        cin >> tip >> a;
        if(tip == 0)
        {
            cin >> b;
            update(a, b);
        }
        else if(tip == 1)
        {
            cin >> b;
            cout << range_query(a, b) << '\n';
        }
        else
        {
            int st, dr, mij;
            st = 1;
            dr = n;
            while(dr > st)
            {
                mij = (st + dr) / 2;
                k = query(mij);
                if(k >= a)
                    dr = mij;
                else
                    st = mij + 1;
            }
            if(query(dr) == a)
                cout << dr << '\n';
            else
                cout << "-1" << '\n';
        }
    }
    return 0;
}