Pagini recente » Cod sursa (job #1595914) | Cod sursa (job #2597718) | Cod sursa (job #1844404) | Cod sursa (job #2628945) | Cod sursa (job #183088)
Cod sursa(job #183088)
//datorii v1.0
#include <stdio.h>
#define MAXN 15005
#define MAXM 100005
int A[MAXN];
int p2[32], p1[MAXN];
int n,m;
inline void update(int p, int x)
{
while ( p <= n )
{
A[p] += x;
p +=p1[p];
}
}
inline int getsum(int p)
{
int S=0;
while ( p > 0 )
{
S+=A[p];
p -=p1[p];
}
return S;
}
void preparations()
{
int i,k=0;
p2[0]=1;
for (i=1; i<=25; i++)
p2[i]=p2[i-1]<<1;
for (i=1; i<=n; i++)
{
k=0;
while (!(i & p2[k]))
k++;
p1[i]=p2[k];
}
}
inline void parsare3 (int *a, int *b, int *c)
{
char s[64]; int j=0,x=0,y=0,z=0;
fgets(s,64,stdin);
while (s[j]>='0' && s[j]<='9')
x=x*10+s[j++]-'0';
j++;
while (s[j]>='0' && s[j]<='9')
y=y*10+s[j++]-'0';
j++;
while (s[j]>='0' && s[j]<='9')
z=z*10+s[j++]-'0';
*a=x; *b=y; *c=z;
}
void citire()
{
char s[MAXN*16]; int i,j,x;
fgets(s,64,stdin);
n=0; m=0; j=0;
while (s[j]>='0' && s[j]<='9')
n=n*10+s[j++]-'0';
j++;
while (s[j]>='0' && s[j]<='9')
m=m*10+s[j++]-'0';
preparations();
fgets(s,MAXN*16,stdin);
for (i=1,j=0; i<=n; i++,j++)
{
x=0;
while (s[j]>='0' && s[j]<='9')
x=x*10+s[j++]-'0';
update(i,x);
}
}
void rezolvare()
{
int t,x,y,i;
for (i=0; i<m; i++)
{
parsare3(&t,&x,&y);
if (t==0)
update(x,(-1)*y);
if (t==1)
printf("%d\n",getsum(y)-getsum(x-1));
}
}
int main()
{
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
citire();
rezolvare();
fclose(stdin);
fclose(stdout);
return 0;
}