Cod sursa(job #1808445)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 17 noiembrie 2016 18:11:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
void upd(int,int);
int getsum(int);
int n,m,i,x,a,b,c,lo,hi,mi,aib[100010];
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x;
        upd(i,x);
    }
    for(;m;m--)
    {
        f>>c;
        if(!c)
        {
            f>>a>>b;
            upd(a,b);
            continue;
        }
        if(c==1)
        {
            f>>a>>b;
            g<<getsum(b)-getsum(a-1)<<'\n';
            continue;
        }
        f>>a;
        if(getsum(n)<a){g<<-1<<'\n';continue;}
        lo=0;hi=n;
        while(hi-lo-1)
        {
            mi=(hi+lo)/2;
            if(getsum(mi)<a)
                lo=mi;
            else
                hi=mi;
        }
        if(getsum(hi)==a)
            g<<hi<<'\n';
        else
            g<<-1<<'\n';
    }
    return 0;
}
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;
    return;
}