Cod sursa(job #3238614)

Utilizator vladsoartavlad sofronea vladsoarta Data 28 iulie 2024 12:02:21
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <cmath>
#define int long long
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");

int aib[100001],n,i,m,v[100001],poz,p2;

void upd(int pos,int val)
{
    for(int j=pos;j<=n;j=j+(j&(-j)))
        aib[j]+=val;
}
int query(int pos)
{
    int s=0;
    for(int j=pos;j>=1;j=j-(j&(-j)))
        s+=aib[j];
    return s;
}

int32_t main()
{
    cin>>n>>m;
    int a,b,k;
    for(i=1; i<=n; i++)
    {
        int elem;
        cin>>elem;
        upd(i,elem);
    }
    for(i=1; i<=m; i++)
    {
        short c;
        cin>>c;
        if(c==0)
        {
            cin>>a>>b;
            upd(a,b);
        }
        else if(c==1)
        {
            cin>>a>>b;
            cout<<query(b)-query(a-1)<<'\n';
        }
        else
        {
            cin>>k;
            p2=(1<<(int)log2(n));
            poz=0;
            int s=0;
            for(;p2>=1;p2=p2/2)
                if(s+aib[poz+p2]<k)
                {
                    s=s+aib[poz+p2];
                    poz=poz+p2;
                }
            if(poz==n)
                cout<<-1<<'\n';
            else
                cout<<poz+1<<'\n';
        }
    }

    return 0;
}