Cod sursa(job #1998809)

Utilizator victoreVictor Popa victore Data 9 iulie 2017 11:50:21
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<cstdio>

#define zeros(x) (x&(-x))

using namespace std;

const int nmax=100005;

int aib[nmax],n;

inline void update(int poz,int val)
{
    int i;
    for(i=poz;i<=n;i+=zeros(i))
        aib[i]+=val;
}

inline int query(int poz)
{
    int i,rez=0;
    for(i=poz;i;i-=zeros(i))
        rez+=aib[i];
    return rez;
}

inline int bsearch(int x)
{
    int step,i;
    for(step=1;step<n;step<<=1);
    for(i=1;step;step>>=1)
        if(i+step<=n&&query(i+step)<=x)
            i+=step;
    if(query(i)==x)
        return i;
    return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int i,q,op,a,b;
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&a);
        update(i,a);
    }
    for(i=1;i<=q;++i)
    {
        scanf("%d",&op);
        if(op<2)
        {
            scanf("%d%d",&a,&b);
            if(op)
                printf("%d\n",query(b)-query(a-1));
            else
                update(a,b);
        }
        else
        {
            scanf("%d",&a);
            printf("%d\n",bsearch(a));
        }
    }
}