Cod sursa(job #605248)

Utilizator chiar_nimeninimeni chiar_nimeni Data 27 iulie 2011 13:46:19
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>

int a[100100], v[100100], i,n,m,t,x,y,s,st,dr,s1,mm,s2;

int bit (int x)
{
    return (-x)&x;
}

void adauga (int p, int x)
{
    while (p<=n)
    {
        v[p]+=x;
        p+=bit(p);
    }
}

int suma (int x)
{
    int sum;
    sum=0;
    while (x>0)
    {
        sum+=v[x];
        x-=bit(x);
    }
    return sum;
}

int main()
{
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);
    scanf ("%d %d",&n,&mm);
    for (i=1; i<=n; i++)
    {
        scanf ("%d",&a[i]);
    }
    for (i=1; i<=n; i++) adauga (i,a[i]);
    for (i=1; i<=mm; i++)
    {
        scanf ("%d",&t);
        if (t==0)
        {
            scanf ("%d %d",&x,&y);
            adauga (x,y);
        }
        else if (t==1)
        {
            scanf ("%d %d",&x,&y);
            s1=0;
            s2=0;
            x--;
            s1=suma(y);
            s2=suma(x);
            s=s1-s2;
            printf ("%d\n",s);
        }
        else if (t==2)
        {
            scanf ("%d",&x);
            st=1;
            dr=n;
            while (st<=dr)
            {
                m=(st+dr)/2;
                s1=0;
                s1=suma(m);
                if (s1==x)
                {
                    printf ("%d\n",m);
                    st=n+1;
                }
                else if (s1>x) dr=m-1;
                else st=m+1;
            }
        }
    }
    return 0;
}