Cod sursa(job #2482886)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 28 octombrie 2019 23:24:51
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define NMAX 200005
#define ZERO(x) ((x^(x-1))&x)
using namespace std;
typedef long long ll;
int aib[100005], n, q, i, j, x, y, tip;
void fast()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    ios_base::sync_with_stdio(false);
    cin.tie();
}
void upd(ll p, ll x)
{
    for(int i=p;i<=n;i+=ZERO(i))
        aib[i]+=x;
}
ll query(ll p)
{
    ll ans=0;
    while(p)
    {
        ans+=aib[p];
        p-=ZERO(p);
    }
    return ans;
}
ll ok(ll m, ll key)
{
    return query(m)<=key;
}
ll cautbin(ll l, ll key, ll r)
{
    while(l!=r)
    {
        ll m=(l+r+1)/2;
        if(ok(m,key))
            l=m;
        else r=m-1;
    }
    return l;
}
int main()
{
    fast();
    cin>>n>>q;
    for(i=1;i<=n;i++)
    {
        cin>>x;
        upd(i,x);
    }
    //for(i=1;i<=n;i++)
      //  cout<<aib[i]<<' ';
    while(q)
    {
        q--;
        cin>>tip;
        if(tip==0)
        {
            cin>>i>>x;
            upd(i,x);
        }
        else if(tip==1)
        {
            cin>>x>>y;
            cout<<query(y)-query(x-1)<<'\n';
        }
        else
        {
            cin>>x;
            if(query(cautbin(1,x,n))==x)
                cout<<cautbin(1,x,n)<<'\n';
            else cout<<"-1\n";
        }
    }
    return 0;
}