Cod sursa(job #215255)

Utilizator RobybrasovRobert Hangu Robybrasov Data 17 octombrie 2008 23:24:13
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#define step (poz^(poz-1))&poz

int A[100010],n,m,a,b,i,nr;

void update(int poz, int val)
{
    int step;
    while (poz<=n)
    {
        A[poz]+=val;
        poz+=step;
    }
}

int query(int poz)
{
    int s=0;
    while (poz)
    {
        s+=A[poz];
        poz-=step;
    }
    return s;
}

int bs(int val)
{
    int i,st;
    for (st=1; st<=n; st<<=1);
    for (i=0; st; st>>=1)
        if (query(i+st)<=val && i+st<=n) i+=st;

    return i;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    for (i=1; i<=n; i++)
    {
        scanf("%d",&nr);
        update(i,nr);
    }
    for (i=1; i<=m; i++)
    {
        scanf("%d",&nr);
        if (!nr)
        {
            scanf("%d %d\n",&a,&b);
            update(a,b);
        }
        else
            if (nr==1)
            {
                scanf("%d %d\n",&a,&b);
                printf("%d\n",query(b)-query(a-1));
            }
            else
            {
                scanf("%d",&a);
                printf("%d\n",bs(a));
            }
    }

    return 0;
}