Cod sursa(job #1134634)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 6 martie 2014 20:05:03
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#define nmax 100009
using namespace std;
int v[nmax],n;
void update(int poz,int x)
{
    int i;
    while(poz<=n)
    {
        v[poz]=v[poz]+x;
        i=0;
        while((poz&(1<<i))==0)
            i++;
        poz=poz+(1<<i);
    }
}
int query(int x)
{
    int i,s=0;
    while(x>0)
    {
        s=s+v[x];
        i=0;
        while(((1<<i)&x)==0)
            i++;
        x=x-(1<<i);
    }
    return s;
}
int search(int val)
{
    int i=1,x=0;
    while(i<=n)
        i*=2;
    i=i/2;
    while(i>0&&val>0)
    {
        if(v[x+i]==val)
            return x+i;
        else
        {
            if(v[x+i]<val)
            {
                val=val-v[x+i];
                x=x+i;
            }
        }
        i=i/2;
    }
    return -1;
}
int main()
{
    int i,m,x,op,y,val,poz;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%d%d",&poz,&val);
            update(poz,val);
        }
        if(op==1)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",query(y)-query(x-1));
        }
        if(op==2)
        {
            scanf("%d",&val);
            printf("%d\n",search(val));
        }
    }
    return 0;
}