Cod sursa(job #3271091)

Utilizator yellowGreenFatu Mihai yellowGreen Data 25 ianuarie 2025 10:12:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
using ll = long long;
ll fnw[100005];
int n,q;
void update(int node,ll val)
{
    for(int i=node;i<=n;i+=(i&(-i)))
        fnw[i]+=val;
}
ll calc(int node)
{
    ll ans=0;
    for(int i=node;i>=1;i-=(i&(-i)))
        ans+=fnw[i];
    return ans;
}
void cb(ll x)
{
    int st=1,dr=n,ans=-1;
    while(st<=dr)
    {
        int mij=(st+dr)>>1;
        ll rsp=calc(mij);
        if(rsp==x)
        {
            ans=mij;
            break;
        }
        if(rsp>=x)
            dr=mij-1;
        else
            st=mij+1;
    }
    cout<<ans<<"\n";
}
int main()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        update(i,x);
    }
    while(q--)
    {
        int op,a,b;
        cin>>op>>a;
        if(op==0)
        {
            cin>>b;
            update(a,b);
        }
        if(op==1)
        {
            cin>>b;
            cout<<calc(b)-calc(a-1)<<"\n";
        }
        if(op==2)
        {
            cb(a);
        }
    }
    return 0;
}