Cod sursa(job #1264427)

Utilizator ccygnusMaygnus Pop ccygnus Data 15 noiembrie 2014 20:00:32
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<cstdio>
int aib[100001],n;
inline int lsb(int x)
{
    return x&-x;
}
void update(int pos,int value)
{
    for(int i=pos;i<=n;i+=lsb(i))
        aib[i]+=value;
}
int Query(int pos)
{
    int ans=0;
    for(int i=pos;i>0;i-=lsb(i))
        ans+=aib[i];
    return ans;
}
int query(int k)
{
    int sol,sc;
    sol=sc=0;
    for(int step=1<<17;step>0;step>>=1)
        if(sol+step<=n && sc+aib[sol+step]<=k)
            {
            sol+=step;
            sc+=aib[sol];
            }
    if (sc!=k || sol==0)
        return -1;
    return sol;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,i,x,y,z;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        {
        scanf("%d",&x);
        update(i,x);
        }
    for(i=1;i<=m;i++)
        {
        scanf("%d",&x);
        if (x==0)
            {
            scanf("%d%d",&y,&z);
            update(y,z);
            }
        if (x==1)
            {
            scanf("%d%d",&y,&z);
            printf("%d\n",Query(z)-Query(y-1));
            }
        if (x==2)
            {
            scanf("%d",&y);
            printf("%d\n",query(y));
            }
        }
return 0;
}