Cod sursa(job #407394)

Utilizator hasegandaniHasegan Daniel hasegandani Data 2 martie 2010 12:11:59
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 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)
{
    if (val > tot)
        return -1;
    int Max,st,dr,mid;
    for(Max=1; Max <= N ;Max<<=1);

    for(st=0,dr=Max; st<=dr; )
        {
   //     printf("%d %d %d\n",st,dr,val);
        if (st==dr)
            if (val==0)
                return st;
            else
                return -1;
        mid= st+(dr-st)/2;

        if (val==aib[mid])
            return mid;
        if (val > aib[mid])
            {
            val -= aib[mid];
            st=mid;
            }
        else
            dr=mid;
        }
    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;
}