Cod sursa(job #73249)
Utilizator | Data | 17 iulie 2007 16:58:46 | |
---|---|---|---|
Problema | Datorii | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2 kb |
/* Problema: 007 Datorii */
/* Autor: Ghitulete Razvan Alin - Craiova */
#include <stdio.h>
#define in "datorii.in"
#define out "datorii.out"
#define Nmax 15005
#define Mmax 100003
int n,a[Nmax];
long m,c[Nmax],s2,s1;
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
int i,tip_operatie,t,v,j,x,y,poz;
scanf("%d %ld",&n,&m);
for (i=1;i<=n;++i)
{
scanf("%d",&a[i]);
poz=0;
j=i;
while (j <= n)
{
c[j]+=a[i];
while ( (j& (1<<poz)) == 0 )
poz++;
j+=(1<<poz);
poz++;
}
}
for (i=1;i<=m;++i)
{
scanf("%d",&tip_operatie);
if (tip_operatie == 0)
{
scanf ("%d %d",&t,&v);
poz=0;
while (t <= n)
{
c[t]-=v;
while ( (t & (1<<poz)) == 0)
{
poz++;
}
t+=(1<<poz);
poz++;
}
}
else
{
scanf("%d %d",&y,&x);
s1=s2=0;
y--;
poz=0;
while (y)
{
s1+=c[y];
while ( (y & (1<<poz)) ==0)
poz++;
y-=1<<poz;
poz++;
}
poz=0;
while (x)
{
s2+=c[x];
while ( (x & (1<<poz)) ==0)
poz++;
x-=1<<poz;
poz++;
}
printf("%ld\n",s2-s1);
}
}
return 0;
}