Cod sursa(job #201388)

Utilizator savimSerban Andrei Stan savim Data 31 iulie 2008 11:10:06
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#define maxl 15010

int n,m,i,j,k,p,q,s1,s2,sol,div;
int c[maxl],a[maxl],p2[maxl];

inline int biti(int i)
{
    sol = i ^ (i & (i-1));
    return p2[sol];
}

void update()
{
     j=p;
     while (j<=n)
     {
           c[j]-=q;  
           j+=1<<biti(j);
     }
}

void querry()
{
     p--;s1=0;s2=0;
     
     while (p>0)
     {
           s1+=c[p];
           p-=1<<biti(p);      
     }
     
     while (q>0)
     {
           s2+=c[q];
           q-=1<<biti(q);
     }
     
     printf("%d\n",s2-s1);
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    
    scanf("%d %d",&n,&m);

    for (i=2; i<=n; i<<=1)
        p2[i]=p2[i>>1]+1;

    for (i=1; i<=n; i++)
    {
        scanf("%d",&k);
        a[i]=a[i-1]+k;
    }
    
    for (i=1; i<=n; i++)
    {
        p=i-(1<<biti(i));
        c[i]=a[i]-a[p];  
    }
    
    for (i=1; i<=m; i++)
    {
        scanf("%d %d %d",&k,&p,&q);

        if (k==0) update();
        else querry();
    }
    
    return 0;    
}