Cod sursa(job #2844954)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 6 februarie 2022 15:30:53
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n,m,aib[100002];
void update(int poz,int x)
{
    while(poz<=n)
    {
        aib[poz]+=x;
        poz+=poz&(-poz);
    }
}
int ras(int poz)
{
    int ans=0;
    while(poz>0)
    {
        ans+=aib[poz];
        poz-=poz&(-poz);
    }
    return ans;
}
int cautare(int x)
{
    int st=1,dr=n;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(ras(mij)<x)
            st=mij+1;
        else
            dr=mij-1;
    }
    return st;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        update(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        int q;
        cin>>q;
        if(q==0)
        {
            int poz,x;
            cin>>poz>>x;
            update(poz,x);
        }
        else
        if(q==1)
        {
            int a,b;
            cin>>a>>b;
            cout<<ras(b)-ras(a-1)<<'\n';
        }
        else
        {
            int X;
            cin>>X;
            int k=cautare(X);
            if(ras(k)==X)
                cout<<k<<'\n';
            else
                cout<<-1<<'\n';
        }
    }

}