Cod sursa(job #2775176)

Utilizator Alex_DiaconuDiaconu Alexandru Alex_Diaconu Data 14 septembrie 2021 19:22:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;

ifstream cin ("aib.in");
ofstream cout ("aib.out");

long long v[100005], n, m;

void update(int a, int b)
{
    while(a<=n)
    {
        v[a]+=b;
        a+=(a&(-a));
    }
}

int query(int a)
{
    int s=0;
    while(a>0)
    {
        s+=v[a];
        a-=(a&(-a));
    }
    return s;
}

int f2(int a, int b)
{
    int st=1, dr=b;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        int s=query(mij);
        if(s==a)
        {
            return mij;
        }
        if(s<a)
        {
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    return -1;
}

int32_t main()
{
    long long a, b, t;
    cin >> n >> m;
    for(int i=1; i<=n; i++)
    {
        cin >> a;
        update(i, a);
    }
    for(int i=1; i<=m; i++)
    {
        cin >> t >> a;
        if(t==2)
        {
            cout << f2(a, n) << '\n';
        }
        else
        {
            cin >> b;
            if(t==1)
            {
                cout << query(b)-query(a-1) << '\n';
            }
            else
                update(a, b);
        }
    }
    return 0;
}