Cod sursa(job #218518)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 2 noiembrie 2008 13:32:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#define MAXIMUS 100002
#define f(x)((x^(x-1))&x)

using namespace std;

int n,m,arb[MAXIMUS];

void update(int pozitie,int valoare)
{
    while(pozitie<=n)
    {
        arb[pozitie]+=valoare;
        pozitie+=f(pozitie);
    }
}

int aduna(int pozitie)
{
    int s=0;
    while(pozitie>0)
    {
        s+=arb[pozitie];
        pozitie-=f(pozitie);
    }
    return s;
}

int minim(int x)
{
    int p;
    for(p=1;p<n;p*=2);
        for(int i=0;p;p/=2)
            if(i+p<=n)
            {
                if(x>=arb[i+p])
                {
                    x-=arb[i+p];
                    i+=p;
                    if(x==0)
                        return i;
                }
            }
    return -1;
}

void solve()
{
    scanf("%d%d",&n,&m);
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x);
    }
    for(int i=0;i<m;i++)
    {
        int zz,x,y;
        scanf("%d",&zz);
        if(zz==0)
        {
            scanf("%d%d",&x,&y);
            update(x,y);
        }
        else
            if(zz==1)
            {
                scanf("%d%d",&x,&y);
                printf("%d\n",aduna(y)-aduna(x-1));
            }
        else
        {
            scanf("%d",&x);
            printf("%d\n",minim(x));
        }
    }
}

int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    solve();
    fclose(stdout);
    return 0;
}