Cod sursa(job #1827105)

Utilizator anamaria41Raicu Ana anamaria41 Data 11 decembrie 2016 14:24:55
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>

using namespace std;

#define ub(x)(x&(-x))

int n,m,op,b,a,s,AIB[100050];

void add(int x,int y)
{
    int i;
    for ( i=x; i<=n; i+=ub(i) )
        AIB[i]+=y;
}

int sum(int x)
{
    int i, suma = 0;

    for ( i=x; i>0; i-=ub(i) )
        suma += AIB[i];
    return suma;
}

void bsearch( int val , int st , int dr )
{
    int mij,t;

    while(st<=dr)
    {
        mij=(st+dr)/2;
        t=sum(mij);
        if(t>val)dr=mij;
        else if(t<val) st=mij+1;
        else if(t==val){ printf("%d\n",mij); break;}
    }
        if(t!=val) printf("-1\n");


}

int main()
{
    int i;

    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=1; i<=n; i++)
       {
         scanf("%d",&a);
         add(i,a);
        }


    for(i=1; i<=m; i++)
    {
        scanf("%d",&op);

        if(op==0)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
        }

        if(op==1)
        {
            scanf("%d%d",&a,&b);
            s=sum(b)-sum(a-1);
            printf("%d\n",s);

        }

        if(op==2)
        {
            scanf("%d",&a);
            bsearch(a,1,n);
        }

    }
    return 0;
}