Cod sursa(job #1162992)

Utilizator macajouMaca George macajou Data 1 aprilie 2014 09:02:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#define nmax 100010

using namespace std;

int n,m,aib[nmax];

int doik(int x)
{
    return (x^(x-1))&x;
}

void citire()
{
    int i,x,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            for(j=i;j<=n;j+=(doik(j)))
                aib[j]+=x;
        }
}

int sum(int x)
{
    int i,s=0;
    for(i=x;i>0;i-=doik(i))
        s+=aib[i];
    return s;
}

int caut(int x)
{
    int i=1,k;
    while(i<n)
          i*=2;
    for(k=0;i>0;i/=2)
        if(k+i<=n && x>=aib[k+i])
            {
                k+=i;
                x-=aib[k];
                if(!x)
                    return k;
            }
    return -1;
}

void rez()
{
    int i,j,op,a,b;
    for(i=1;i<=m;i++)
        {
            scanf("%d",&op);
            if(op==2)
               scanf("%d",&a);
            else scanf("%d%d",&a,&b);
            if(op==0)
               {
                   for(j=a;j<=n;j+=doik(j))
                   aib[j]+=b;
               }
            else if(op==1)
                    printf("%d\n",sum(b)-sum(a-1));
            else printf("%d\n",caut(a));
        }
}

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

    citire();
    rez();

    return 0;
}