Cod sursa(job #174137)

Utilizator AlxCojocaru Alexandru Alx Data 8 aprilie 2008 15:02:31
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
long n,m,arb[100001],k,a,b;
void update(long pos,long val)
{
    long c=0;
    while (pos<=n)
    {
        arb[pos]+=val;
        while (!(pos&1<<c))
         c++;
        pos+=1<<c;
        c++;
    }
}
long query(long pos)
{
    long s=0,c=0;
    while (pos>0)
    {
        s+=arb[pos];
        while (!(pos&1<<c))
         c++;
        pos-=1<<c;
        c++;
    }
    return s;
}
long search(long val)
{
    long c=1,i=0;
    while (c<n)
     c<<=1;
    while (c)
    {
        if (val>=arb[i+c])
        {
            i+=c;
            val-=arb[i];
            if (!val)
             return i;
        }
        c>>=1;
    }
    return -1;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%ld %ld\n",&n,&m);
    long i,x;
    for (i=1;i<=n;i++)
    {
        scanf ("%ld",&x);
        update(i,x);
    }
    for (i=0;i<m;i++)
    {
        scanf ("%ld",&k);
        switch (k)
        {
            case 0:scanf("%ld %ld\n",&a,&b); update(a,b);break;
            case 1:scanf("%ld %ld\n",&a,&b); printf("%ld\n",query(b)-query(a-1));break;
            case 2:scanf("%ld\n",&a); printf("%ld\n",search(a));break;
        }
    }
    return 0;
}