Cod sursa(job #201385)

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

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

inline int biti(int i)
{
    div=2;sol=0;
    while (i%div==0)
    {
          ++sol;
          div*=2;
    }
    
    return 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=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;    
}