Cod sursa(job #174350)

Utilizator DorinOltean Dorin Dorin Data 8 aprilie 2008 19:57:54
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
# include <stdio.h>

# define input "aib.in"
# define output "aib.out"

# define max 100001

int a[max],i,n,s;
int x,y,q,tq,pow,j;

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

void insert(int i, int x)
{
     for(; i <= n; i+=bit(i))
        a[i] += x;
}

int sum ( int x )
{
    int ret = 0;
    for(; x ; x-=bit(x))
       ret += a[x];
    return ret;
}

int main()
{
    freopen(input, "r", stdin);
    freopen(output, "w", stdout);
    
    scanf("%d%d",&n,&q);
    
    for ( i = 1; i <= n; i++)
    {
       scanf("%d", &x);
       insert(i,x);
    }
    
    for( pow = 1 ;pow <= n ; pow <<= 1);
    pow >>= 1;
    
    while(q--)
    {
        scanf("%d",&tq);
        if(tq == 0)
        {
           scanf("%d%d",&x,&y);
           insert(x,y);
           continue;
        }
        if(tq == 1)
        {
              scanf("%d%d",&x,&y);
              printf("%d\n",sum(y) - sum(x-1));
              continue;
        }
        scanf("%d",&x);
        i = 0, j = pow, s = 0;
        while( j )
        {
               if(i+j <= n && a[i+j] + s <= x ) {i+=j;s += a[i];}
               j>>=1;
        }
        if( s == x )
           printf("%d\n",i);
        else
           printf("-1\n");
    }
    
    return 0;
}