Cod sursa(job #429860)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 30 martie 2010 15:51:22
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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(i=1,p=1;i<=N;i++)
    {
        if(arb[p]==a)
            return p;
        p+=zeroz(p);
        if(p>N)
            p=i;
    }
    return 0;
}

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;
}