Cod sursa(job #2940927)

Utilizator matei0000Neacsu Matei matei0000 Data 16 noiembrie 2022 19:29:48
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
long long sume[100005];
int aib[100005];
int n;
void fct0(int a, int b)
{
    while(a<=n)
    {
        aib[a]+=b;
        a+=(a&-a);
    }
}
int fct1(int a, int b)
{
    int ras1=0;
    a--;
    while(a>0)
    {
        ras1+=aib[a];
        a-=(a&-a);
    }
    int ras2=0;
    while(b>0)
    {
        ras2+=aib[b];
        b-=(b&-b);
    }
    return ras2-ras1;
}
int fct2(int a)
{
    int pas=131072,sum=0,poz=0;
    while(pas>0)
    {
        if(poz+pas<=n && sum+aib[poz+pas]<=a)
        {
            poz+=pas;
            sum+=aib[poz];
        }
        pas/=2;
    }
    if(sum==a)
        return poz;
    return -1;
}
int main()
{
    int m,x;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        sume[i]=sume[i-1]+x;
        aib[i]=sume[i]-sume[i-(i&-i)];
    }
    for(int i=0;i<m;i++)
    {
        int cer,a,b;
        cin>>cer;
        if(cer==0)
        {
            cin>>a>>b;
            fct0(a,b);
        }
        if(cer==1)
        {
            cin>>a>>b;
            cout<<fct1(a,b)<<'\n';
        }
        if(cer==2)
        {
            cin>>a;
            cout<<fct2(a)<<'\n';
        }
    }
    return 0;
}