Cod sursa(job #2455511)

Utilizator LXGALXGA a LXGA Data 11 septembrie 2019 20:52:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;
int a[100001];int n,m;
ifstream cin("aib.in");
ofstream cout("aib.out");
#define lsb(i) ((i) & -(i))

void update(int pos,int x)
{
    for(int i=pos;i<=n;i+=lsb(i))
        a[i]+=x;
}

int sum(int pos)
{
    int s=0;
    for(int i=pos;i>=1;i-=lsb(i))
        s+=a[i];
    return s;
}



int Search(int val)
{
    int i, step;

    for(step=1;step<n;step<<=1);

    for(i=0;step;step>>=1)
    {
         if( i+step<= n)
         {
            if(val>=a[i+step])
            {
                i += step, val -= a[i];
                if ( !val ) return i;
            }
         }
    }

    return -1;
}




int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>m;
    int x;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        update(i,x);
    }
    int c,a,b;
    for(int i=1;i<=m;i++)
    {
        cin>>c;
        if(c==0)
        {
            cin>>a>>b;
            update(a,b);
        }
        else if(c==1)
        {
            cin>>a>>b;
            cout<<sum(b)-sum(a-1)<<"\n";
        }
        else if(c==2)
        {
            cin>>a;
            cout<<Search(a)<<"\n";
        }
    }
    return 0;
}