Cod sursa(job #901713)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 1 martie 2013 11:23:52
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<cstdio>
#define powZero(x) (x^(x-1))&x
#define INF 100001

int n,m;
long long aib[INF];


void add(int poz,int val)
{
    for(int i=poz;i<=n;i+=powZero(i))
        aib[i]+=val;
}

long long sum(int poz)
{
    int ret=0;
    for(int i=poz;i>=1;i-=powZero(i))
        ret+=aib[i];
     return ret;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
    {
        int x;
        scanf("%d",&x);
        add(i,x);
    }
    for(int i=1;i<=m;++i)
    {
        int c,a,b;
        scanf("%d",&c);
        if(c==0){scanf("%d%d",&a,&b);add(a,b);}
        if(c==1){scanf("%d%d",&a,&b);printf("%d\n",sum(b)-sum(a-1));}
        if(c==2)
        {
            scanf("%d",&a);
            int st=1,dr=n,m,s;
            while(st<=dr)
            {
                m=(st+dr)/2;
                s=sum(m);
                if(s==a){printf("%d\n",m);break;}
                if(s<a)st=m+1;
                if(s>a)dr=m;
            }
            if(s!=a)printf("-1\n");
        }
    }
    return 0;

}