Cod sursa(job #35547)

Utilizator cos_minBondane Cosmin cos_min Data 22 martie 2007 10:30:49
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>

#define in "datorii.in"
#define out "datorii.out"
#define dim 2*15001

int c[dim], spart[dim], a[dim];
int n, m;

void Update(int a, int val);
int Query(int st, int dr);

int main()
{
    int k, p, v;
    
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d",&n,&m);
    
    for ( int i = 1; i <= n; i++ )
    {
        scanf("%d",a+i);
        spart[i] = spart[i-1] + a[i];
    }    
    
    for ( int i = 1; i <= n; i++ )
    {
        k = 0;
        v = i;
        p = v%2;
        while ( p == 0 ) k += 1, v /= 2, p = v % 2;
        
        int val = 1<<k;
        
        if ( k == 0 ) c[i] = a[i];
        else          c[i] = spart[i]-spart[i-val];
    }    
    
    int type, a, b;
    
    for ( int i = 1; i <= m; i++ )
    {
        scanf("%d%d%d",&type,&a,&b);
        if ( type == 0 )
        {
            Update(a,-b);
        }    
        else
        {
            printf("%d\n", Query(a,b) );
        }    
    }    
}    

void Update(int ind, int val)
{
    int v, p, k;
    k=0;
    while ( ind <= n )
    {
        c[ind] += val;
       /* v = ind;
        p = v % 2;
    
        //while ( p == 0 ) k+=1, v /= 2, p = v % 2;*/
        while( (ind & (1 << k)) == 0 ) k++;
        
        int q = 1<<k;
        ind += q;
        k++;
    }    
}    

int Query(int st, int dr)
{
    int s1 = 0;
    int v, p, k=0;
            
    while ( dr > 0 )
    {
        s1 += c[dr];
        while( (dr & (1 << k)) == 0)   k++;
				
        int q = 1<<k;
        dr -= q;
        k++;
    }    
            
    int s2 = 0;
    k = 0;
    st -= 1;
            
    while ( st > 0 )
    {
        s2 += c[st];
        /*v = st;
        p = v%2;
                
        while ( p == 0 ) k+=1, v /= 2, p = v%2;*/
        while( (st & (1 << k)) == 0)  k++;
                
        int q = 1<<k;
        st -= q;
        k++;
    }    
    
    return s1-s2;
}