Cod sursa(job #1134653)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 6 martie 2014 20:13:41
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#define nmax 100009
using namespace std;
long long v[nmax],n;
void update(int poz,int x)
{
    int i;
    while(poz<=n)
    {
        v[poz]=v[poz]+x;
        i=0;
        while((poz&(1<<i))==0)
            i++;
        poz=poz+(1<<i);
    }
}
long long query(long long x)
{
    long long i,s=0;
    while(x>0)
    {
        s=s+v[x];
        i=0;
        while(((1<<i)&x)==0)
            i++;
        x=x-(1<<i);
    }
    return s;
}
long long cauta(long long val)
{
    long long i=1,x=0;
    while(i<=n)
        i*=2;
    i=i/2;
    while(i>0&&val>0)
    {
        if(v[x+i]==val)
            return x+i;
        else
        {
            if(v[x+i]<val)
            {
                val=val-v[x+i];
                x=x+i;
            }
        }
        i=i/2;
    }
    return -1;
}
int main()
{
    long long i,m,x,op,y,val,poz;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&x);
        update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%lld",&op);
        if(op==0)
        {
            scanf("%lld%lld",&poz,&val);
            update(poz,val);
        }
        if(op==1)
        {
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",query(y)-query(x-1));
        }
        if(op==2)
        {
            scanf("%lld",&val);
            printf("%lld\n",cauta(val));
        }
    }
    return 0;
}