Cod sursa(job #1508092)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 22 octombrie 2015 12:02:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<cstdio>
#define ub(x) (x&(-x))

using namespace std;

int op,aib[100002],i,n,m,mij,st,dr,x,y;

void add(int poz,int k)
{
    int i;
    for(i=poz;i<=n;i+=ub(i))
    {
        aib[i]+=k;
    }
}

int computionare(int poz)
{
    int i=poz,s=0;
    while(i>0)
    {
        s+=aib[i];
        i-=ub(i);
    }
    return s;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        add(i,x);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%d%d",&x,&y);
            add(x,y);
        }
        if(op==1)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",computionare(y)-computionare(x-1));
        }
        if(op==2)
        {
            scanf("%d",&x);
            st=1;
            dr=n;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                y=computionare(mij);
                if(y<x)
                {
                    st=mij+1;
                }
                else
                {
                    if(y>x)
                    {
                        dr=mij-1;
                    }
                    else
                    {
                        printf("%d\n",mij);
                        break;
                    }
                }
            }
            if(st>dr)
            {
                printf("-1\n");
            }
        }
    }
    return 0;
}