Cod sursa(job #550508)

Utilizator LgregL Greg Lgreg Data 9 martie 2011 18:04:32
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>

int aib[101010],N,M;
int tip,x,y;

int zero(int x)
{
    return (x^(x-1))&x;
}
int add(int poz,int x)
{
    for(int i=poz;i<=N;i+=zero(i))
        aib[i]+=x;
}
int querry(int poz)
{
    int S=0;
    for(int i=poz;i>=1;i-=zero(i))
        S+=aib[i];
        return S;

}
int search(int val)
{
    int poz;
    for(poz=1;poz<N;poz=poz*2);
    for(int i=0;poz;poz=poz/2)
    {
        if(i+poz<=N)
        {
            if(aib[i+poz]<=val)
            {
                i+=poz,val-=aib[i];
                if(val==0)
                    return i;
            }
        }
    }
    return -1;
}



int main()
{
freopen("aib.in","r",stdin);
froepen("aib.out","w",stdout);
 scanf("%d%d",&N,&M);
        for(int i=1;i<=N;++i)
        {
            scanf("%d",&x);
            add(i,x);
        }
        for(int i=1;i<=M;++i)
        {
            scanf("%d",&tip);
            if(tip==0)
            {
                scanf("%d%d",&x,&y);
                add(x,y);
            }
            else if(tip==1)
            {scanf("%d%d",&x,&y);
                printf("%d\n",querry(y)-querry(x-1));
            }
            else
            {
                scanf("%d",&x);
                printf("%d\n",search(x));
            }
        }
}