Cod sursa(job #954858)

Utilizator dariusdariusMarian Darius dariusdarius Data 30 mai 2013 11:43:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
#define lsb(x) ((x)&(-x))
int n,aib[100005];
void update(int p,int val)
{
    for(;p<=n;p+=lsb(p))
        aib[p]+=val;
}
int query(int p)
{
    int ans=0;
    for(;p;p-=lsb(p))
        ans+=aib[p];
    return ans;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,x,y,tip,PASMAX;
    scanf("%d%d",&n,&m);
    for(PASMAX=1;PASMAX<=n;PASMAX<<=1);PASMAX>>=1;
    for(int i=1;i<=n;i++)
        scanf("%d",&x),
        update(i,x);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&tip);
        if(tip==0)
            scanf("%d%d",&x,&y),
            update(x,y);
        else
            if(tip==1)
                scanf("%d%d",&x,&y),
                printf("%d\n",query(y)-query(x-1));
            else
            {
                scanf("%d",&x);
                int ans=0;
                for(int pas=PASMAX;pas;pas>>=1)
                    if(ans+pas<n && query(ans+pas)<x)
                        ans+=pas;
                if(query(ans+1)==x)
                    printf("%d\n",ans+1);
                else
                    printf("-1\n");
            }
    }
    return 0;
}