Cod sursa(job #2445004)

Utilizator petrisorvmyVamanu Petru Gabriel petrisorvmy Data 2 august 2019 10:51:00
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#define NMAX 100010
#define ll int
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
ll v[NMAX], aib[NMAX], n ,m, tip, a, b;
void update(ll nod, ll val)
{
    for(ll i = nod; i <= n; i += (i & (-i)) )
        aib[i] += val;
}
ll suma(ll nod)
{
    ll sum = 0;
    for(ll i = nod; i; i -= (i & (-i)))
        sum += aib[i];
    return sum;
}
ll cb(ll k)
{
    ll st, dr, mid,ans = 0;
    st = 1, dr = n;
    while(st <=  dr)
    {
        mid = st + (dr - st) / 2;
        if(suma(mid) < k)
        {
            ans = mid;
            st = mid + 1;
        }
        else dr = mid - 1;
    }
    if(suma(ans+1) == k)
        return ans+1;
    else return -1;
}
int main()
{
    f >> n >> m;
    for(ll i = 1; i <= n; ++i)
    {
        f >> v[i];
        update(i, v[i]);
    }
    for(ll i = 1; i <= m; ++i)
    {
        ll task;
        f >> task;
        if(task == 0)
        {
            f >> a >> b;
            update(a,b);
        }
        else if(task == 1)
        {
            f >> a >> b;
            g << suma (b) -  suma(a - 1) << '\n';
        }
        else if(task == 2)
        {
            f >> a;
            g << cb(a) << '\n' ;
        }
    }
    f.close();
    g.close();
    return 0;
}