Cod sursa(job #552129)

Utilizator nickyyLal Daniel Emanuel nickyy Data 11 martie 2011 18:06:39
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>
#define maxn 100005
int aib[maxn];
int n;

void modifica(int , int);
int suma(int);
int cauta(int);

int main(void)
{   int i,k,a,b,m;

    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&a), modifica(i,a);
    for(; m; m--)
    {   scanf("%d",&k);
        if(k<2)
        {   scanf("%d%d",&a,&b);
            if(k==0) modifica(a,b);
            else printf("%d\n",suma(b)-suma(a-1));
        }
        else
            scanf("%d",&a), printf("%d\n",cauta(a));
    }
    return 0;
}

void modifica(int poz,int val)
{   int k=0;
    while(poz<=n)
    {   aib[poz]+=val;
        while( !(poz & (1<<k)) ) k++;
        poz+=(1<<k);
        k++;
    }
}

int suma(int poz)
{   int k=0,s=0;
    while(poz>0)
    {   s+=aib[poz];
        while(!(poz & (1<<k))) k++;
        poz-=(1<<k);
        k++;
    }
    return s;
}

int cauta(int val)
{   int i,step;
    for(step=1; step<=n; step<<=1);
    for(i=0; step; step>>=1)
        if(step+i<=n)
            if(val>=aib[step+i])
            {   i+=step; val-=aib[i];
                if(val==0) return i;
            }
    return -1;
}