Cod sursa(job #429891)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 30 martie 2010 16:25:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#define IN "aib.in"
#define OUT "aib.out"
#define zeroz(x) ((x^(x-1))&x)
#define Lg 100100

using namespace std;

int arb[Lg], N, M;

void add(int inc,int val)
{
    for(;inc<=N;inc+=zeroz(inc))
        arb[inc]+=val;
}

void citire()
{
    int val;
    scanf("%d %d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        cin>>val;
        add(i,val);
    }
}

int suma(int a)
{
    int s=0;
    for(int i=a;i>0;i-=zeroz(i))
        s+=arb[i];
    return s;
}

int poz(int a)
{
    int i,p;
    for (p=1; p<N; p<<=1);

    for(i=0; p; p>>=1)
        if(i+p<=N)
            if(a>=arb[p+i])
            {
                a-=arb[p+i];
                i+=p;
                if(!a)
                    return i;
            }


    return -1;
}

void solve()
{
    int op,a,b;
    for(int i=1;i<=M;i++)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%d %d",&a,&b);
            add(a,b);
        }
        else if(op==1)
        {
            scanf("%d %d",&a,&b);
            printf("%d\n",suma(b)-suma(a-1));
        }
        else if(op==2)
        {
            scanf("%d",&a);
            printf("%d\n",poz(a));
        }
    }
}


int main ()
{
    freopen (IN,"r",stdin);
    freopen (OUT,"w",stdout);

    citire();
    solve();

    return 0;
}