Cod sursa(job #955750)

Utilizator thewildnathNathan Wildenberg thewildnath Data 1 iunie 2013 14:22:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<stdio.h>

int aib[100005],n,p;

int lsb(int x)
{
    return ((x^(x-1))+1)>>1;
}

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

int query(int pos)
{
    int ans=0;
    while(pos)
    {
        ans+=aib[pos];
        pos-=lsb(pos);
    }
    return ans;
}
int bs(int k)
{
    int val=k,ans=0;
    for(int i=p-1;i>=0;i--)
    {
        if(ans+(1<<i)<=n)
            if(aib[ans+(1<<i)]<val)
            {
                ans+=(1<<i);
                val-=aib[ans];
            }
    }
    if(query(ans+1)==k)
        return ans +1;
    return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int i,m,a,b,op,val;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a);
        update(i,a);
    }
    val=1;
    p=0;
    while(val<=n)
    {
        val=val*2;
        p++;
    }
    val=val/2;
    p=17;
    while(m--)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%d%d",&a,&b);
            update(a,b);
        }
        else if(op==1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",query(b)-query(a-1));
        }
        else
        {
            scanf("%d",&a);
            printf("%d\n",bs(a));
        }
    }
    return 0;
}