Cod sursa(job #826360)

Utilizator ericptsStavarache Petru Eric ericpts Data 30 noiembrie 2012 17:16:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
using namespace std;
int arb[1<<18];
int n;
void update(int ind,int val)
{
    int pos = 0;
    while(ind <= n)
    {
        arb[ind]+= val;
        while(!(ind & (1 << pos)))
            ++pos;
        ind += (1<<pos);
        ++pos;
    }
}
int search(int val)
{
    int log,i;
    log = 1,i=0;
    for(;log<n;log<<=1);
    for(;log;log>>=1)
    {
        if(i+log <= n)
            if(val >= arb[i+log])
            {
                i|=log;
                val-=arb[i];
                if(!val)
                    return i;
            }
    }
    return -1;
}
int query(int ind)
{
    int s = 0;
    int pos = 0;
    while(ind)
    {
        s+= arb[ind];
        while(!(ind & (1<<pos)))
            ++pos;
        ind -= (1<<pos);
        ++pos;
    }
    return s;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,i,a,b,tip;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&a);
        update(i,a);
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d",&tip);
        if(tip == 1)
        {
            scanf("%d %d",&a,&b);
            printf("%d\n",query(b)-query(a-1));
        }
        else if(!tip)
        {
            scanf("%d %d",&a,&b);
            update(a,b);
        }
        else
        {
            scanf("%d",&a);
            printf("%d\n",search(a));
        }

    }
    return 0;
}