Cod sursa(job #1074976)

Utilizator heracleRadu Muntean heracle Data 8 ianuarie 2014 12:02:14
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <cstdio>

const int Q=100001;

int v[Q],arb[Q];
int n,m;

void update(int k, int val)
{
    int act=k;

    while(act<=n)
    {
        arb[act]+=val;
        act+=act&(-act);
    }
}

int resp(int k)
{
    int rez=0;
    while(k>0)
    {
        rez+=arb[k];
        k-=k&(-k);
    }
    return rez;
}

int binarizare(int val)
{
    int st=1, dr=n,mj,act;

    while(st<dr-1)
    {
        mj=(st+dr)/2;
        act=resp(mj);
        if(act>val )
            dr=mj;
        if(act <val )
            st=mj;
        if(act == val)
            return mj;
    }
    mj=(st+dr)/2;
    act=resp(mj);
    if(act>val )
        dr=mj;
    if(act <val )
        st=mj;
    if(act == val)
        return mj;

    act=resp(mj+1);
    if(act == val)
        return mj+1;
    return -1;
}

int binarizare2(int val)
{
    int st=1, dr=n,mj,act;

    while(st!=dr-1)
    {

        mj=(st+dr+1)/2;
        act=resp(mj);
        if(act>val )
            dr=mj;
        if(act <val )
            st=mj;
        if(act == val)
            return mj;
    }

    mj=(st+dr+1)/2;
    act=resp(mj);
    if(act>val )
        dr=mj;
    if(act <val )
        st=mj;
    if(act == val)
        return mj;



    act=resp(st);
    if(act==val)
        return st;

    return -1;

}

int bin(int x)
{
    int i=0, pas=1<<x;

    while(pas!=0)
    {
        if(i+pas<=n && arb[i+pas]<=x )
        {
            x-=arb[i+pas];
            i+=pas;
        }
        pas/=2;
    }
    return i;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);

    for(int i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);
        update(i,v[i]);
    }

    int op,a,b;

    for(int i=1; i<=m; i++)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%d%d",&a,&b);
            v[a]+=b;
            update(a,b);
        }
        if(op==1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",resp(b)-resp(a-1));
        }
        if(op==2)
        {
            scanf("%d",&a);
            printf("%d\n",bin(a));
        }

    }

    return 0;
}