Cod sursa(job #3151007)

Utilizator ReBeGhElRebegea Stefan ReBeGhEl Data 19 septembrie 2023 12:51:05
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>

using namespace std;
vector < int > aib;
int n,m;
void update ( int i, int nr)
{
    while(i<=n)
    {
        aib[i]+=nr;
        i+=( i & (-i) );
    }
}

int prefix_sum(int i)
{
    int sum=0;
    while(i>0)
    {
        sum+=aib[i];
        i-= ( i & (-i) );
    }
    return sum;
}

int range_sum(int i, int j)
{
    return prefix_sum(j)-prefix_sum(i-1);
}

int Lbound(int k)
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=(l+r)/2,aux=prefix_sum(mid);
        if(aux>=k)
            r=mid;
        else
            l=mid+1;
    }
    return l;
}
int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int a,b,c,i;
    cin>>n>>m;
    aib.resize(n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        update(i,a);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>a;
        if(a==0)
        {
            cin>>b>>c;
            update(b,c);
        }
        else if(a==1)
        {
            cin>>b>>c;
            cout<<range_sum( min(b,c) ,max (b,c) );
            cout<<'\n';
        }
        else
        {
            cin>>b;
            int x=Lbound(b);
            if(prefix_sum(x)==b)
                cout<<b;
            else
                cout<<"-1";
            cout<<'\n';
        }

    }
    return 0;
}