Pagini recente » Cod sursa (job #1271873) | Cod sursa (job #3131143) | Cod sursa (job #793890) | Cod sursa (job #2261269) | Cod sursa (job #35547)
Cod sursa(job #35547)
#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;
}