Cod sursa(job #2785848)

Utilizator mateitudordmDumitru Matei mateitudordm Data 19 octombrie 2021 18:07:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>

using namespace std;

int aib[100001],n;
int lsb(int x)
{
    return (x&(-x));
}
void update(int poz,int val)
{
    while(poz<=n)
    {
        aib[poz]+=val;
        poz=poz+lsb(poz);
    }
}
int query(int dr)
{
    int s=0;
    while(dr>=1)
    {
        s+=aib[dr];
        dr-=lsb(dr);
    }
    return s;
}


int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int m,c,i,a,b,st,dr,mij,q,sol;
    cin>>n>>m;
    for(i=1; i<=n; i++)
    {
        cin>>a;
        update(i,a);
    }
    for(i=1;i<=m;i++)
    {
        cin>>c;
        if(c==0)
        {
            cin>>a>>b;
            update(a,b);
        }
        else if(c==1)
        {
            cin>>a>>b;
            cout<<query(b)-query(a-1)<<'\n';
        }
        else if(c==2)
        {
            cin>>a;
            st=1,dr=n,sol=-1;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                q=query(mij);
                if(q<a)
                    st=mij+1;
                else if(q>a)
                    dr=mij-1;
                else
                    sol=mij,st=dr+1;
            }
            cout<<sol<<'\n';
        }
    }
    return 0;
}