Cod sursa(job #532540)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 11 februarie 2011 21:24:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>

int n,m,v[100001],a[100001],s;

void update(int x,int y)
{
    int c=0;
    while (x<=n)
    {
        a[x]+=y;
        while (!(x&(1<<c))) ++c;
        x+=(1<<c);
        ++c;
    }
}

int query(int x)
{
    int s=0,c=0;
    while (x>0)
    {
        s+=a[x];
        while (!(x&(1<<c))) ++c;
        x-=(1<<c);
        ++c;
    }
    return s;
}

int search(int x)
{
    int i,s;
    for (s=1;s<=n;s<<=1);
    for (i=0;s;s>>=1)
        if ((i+s<=n)&&(x>=a[i+s]))
        {
            i+=s;
            x-=a[i];
            if (!x) return i;
        }
    return -1;
}

int main()
{
    int i,x,y,z;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;++i)
    {
        scanf("%d",&v[i]);
        v[i]+=v[i-1];
    }
    for (i=1;i<=n;++i)
        a[i]=v[i]-v[i-((i^(i-1))&i)];
    for (i=1;i<=m;++i)
    {
        scanf("%d",&x);
        if (!x)
        {
            scanf("%d%d",&y,&z);
            update(y,z);
        }
        else if (x==1)
        {
            scanf("%d%d",&y,&z);
            printf("%d\n",query(z)-query(y-1));
        }
        else
        {
            scanf("%d",&y);
            printf("%d\n",search(y));
        }
    }
    return 0;
}