Cod sursa(job #407397)

Utilizator hasegandaniHasegan Daniel hasegandani Data 2 martie 2010 12:13:25
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>

#define Nmax 100005

int aib[Nmax],N,tot;

void add(int poz,int val)
{
    for(int t=poz; t<=N; t += (t&-t))
        aib[t] += val;
}

int querry(int poz)
{
    int Sol=0;
    for(int t=poz; t ; t-= (t&-t))
        Sol += aib[t];
    return Sol;
}

int find(int val)
{
    int i,step;
    for(step=1; step<N ; step<<=1);

    for(i=0; step ; step>>=1)
        if (step+i<=N && aib[i+step]<=val)
            {
            i+=step;
            val-=aib[i];
            if (!val)
                return i;
            }
    return -1;
}

void solve()
{
    int M,a,b,c,x;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;++i)
        {
        scanf("%d",&a);
        add(i,a);
        tot+=a;
        }
    for(int i=1;i<=M;++i)
        {
        scanf("%d%d",&x,&a);
        if (x==0)
            {
            scanf("%d",&b);
            add(a,b);
            tot+=b;
            }
        if (x==1)
            {
            scanf("%d",&b);
            printf("%d\n",querry(b)-querry(a-1));
            }
        if (x==2)
            printf("%d\n",find(a));
        }
}

int main()
{
    solve();
    return 0;
}