Cod sursa(job #612634)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 9 septembrie 2011 11:33:55
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<stdio.h>
int a[100100];
inline int zero(int x)
{
    if(x==0)
        return 0;
    int t=0;
    while(x%2==0)
    {
        x>>=1;
        t++;
    }
    return t;
}
int sum(int x)
{
    int t=0;
    while(x)
    {
        t+=a[x];
        x-=1<<zero(x);
    }
    return t;
}
int bs(int x,int dr)
{
    int st=1,mid=0,last=-1,y;
    while(st<=dr)
    {
        mid=st+((dr-st)>>1);
        y=sum(mid);
        if(x==y)
        {
            last=mid;
            dr=mid-1;
        }
        if(x<y)
            dr=mid-1;
        if(x>y)
            st=mid+1;
    }
    return last;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int n,m,i,x,j,t,y,sum1,sum2;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        j=i;
        while(j<=n)
        {
            a[j]+=x;
            j+=1<<zero(j);
        }
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d",&t);
        if(t==0)
        {
            scanf("%d%d",&x,&y);
            j=x;
            while(j<=n)
            {
                a[j]+=y;
                j+=1<<zero(j);
            }
        }
        if(t==1)
        {
            scanf("%d%d",&x,&y);
            sum1=sum2=0;
            x--;
            j=x;
            while(j)
            {
                sum1+=a[j];
                j-=1<<zero(j);
            }
            j=y;
            while(j)
            {
                sum2+=a[j];
                j-=1<<zero(j);
            }
            printf("%d\n",sum2-sum1);
        }
        if(t==2)
        {
            scanf("%d",&x);
            printf("%d\n",bs(x,n));
        }
    }
    return 0;
}