Pagini recente » Cod sursa (job #407770) | Cod sursa (job #1432843) | Cod sursa (job #1854274) | Cod sursa (job #1059946) | Cod sursa (job #76728)
Cod sursa(job #76728)
#include <stdio.h>
#define infile "datorii.in"
#define outfile "datorii.out"
long *a, *c, n, m, i, j;
long nr_zero(long);
void index();
void scade(long,long);
long suma(long,long);
long putere(long);
int main()
{
long x, y, z;
freopen(infile, "r", stdin);
freopen(outfile, "w", stdout);
scanf("%ld %ld\n", &n, &m);
a=new long [n+1];
c=new long [n+1];
for (i=0; i<=n; i++) c[i]=0;
for (i=1; i<=n; i++) scanf("%ld ", &a[i]);
index();
for (i=0; i<m; i++)
{
scanf("%ld %ld %ld\n", &x, &y, &z);
if (x==0) scade(y,z);
else printf("%ld\n", suma(y,z));
}
fclose(stdin);
fclose(stdout);
return 0;
}
long nr_zero(long x)
{
long temp=0;
while (!(x%2))
{
x/=2;
temp++;
}
return temp;
}
long putere(long x)
{
if (x==0) return 1;
long A=1;
for (long ii=1; ii<=x; ii++) A*=2;
return A;
}
void index()
{
long temp, aux;
for (i=1; i<=n; i++)
{
aux=putere(nr_zero(i));
for (j=i; j>=i-aux+1; j--)
c[i]+=a[j];
}
}
void scade(long x, long y)
{
while (x<=n)
{
c[x]-=y;
x+=putere(nr_zero(x));
}
}
long suma(long x, long y)
{
long temp=0, temp2=0;
x--;
while (x)
{
temp+=c[x];
x-=putere(nr_zero(x));
}
while (y)
{
temp2+=c[y];
y-=putere(nr_zero(y));
}
return temp2-temp;
}