Cod sursa(job #1999847)

Utilizator RaduhhRadu Flocea Raduhh Data 12 iulie 2017 11:55:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda rf_2 Marime 1.05 kb
#include <fstream>

using namespace std;

int n,m,i,x,a,b,c,st,dr,mi,aib[100010];

int getsum(int p)
{
    int s=0;
    for(;p;p-=p&(-p))
        s+=aib[p];
    return s;
}

void upd(int p,int d)
{
    for(;p<=n;p+=p&(-p))
        aib[p]+=d;
}

int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        cin>>x;
        upd(i,x);
    }
    while (m--){
        cin>>c;
        if(!c)
        {
            cin>>a>>b;
            upd(a,b);
            continue;
        }
        if(c==1)
        {
            cin>>a>>b;
            cout<<getsum(b)-getsum(a-1)<<'\n';
            continue;
        }
        cin>>a;
        if(getsum(n)<a) { cout<<-1<<'\n'; continue; }
        st=0; dr=n;
        while(dr!=st+1)
        {
            mi=(dr+st)/2;
            if(getsum(mi)<a)
                st=mi;
            else
                dr=mi;
        }
        if(getsum(dr)==a)
            cout<<dr<<'\n';
        else
            cout<<-1<<'\n';
    }
}