Pagini recente » Diferente pentru home intre reviziile 902 si 799 | Monitorul de evaluare | Rating adieldinu (adieldinu) | Cod sursa (job #1621789) | Cod sursa (job #61664)
Cod sursa(job #61664)
#include <stdio.h>
#define forn(i,n) for(int i=0;i<n;i++)
#define maxN 66000
FILE*fi,*fo;
int n,m,vec[maxN],umsk;
void inputFunc(){
fi=fopen("datorii.in","r"),fo=fopen("datorii.out","w");
fscanf(fi,"%d %d",&n,&m);
umsk=1;for(int j=n;j;j>>=1)umsk<<=1;
for(int i=umsk,t=n+umsk;i<t;i++)fscanf(fi,"%d",vec+i);
}
int main(){
inputFunc();
for(int i=n+umsk-1;i>1;i--)vec[i>>1]+=vec[i];
forn(q,m){
int op,x,y;
fscanf(fi,"%d %d %d",&op,&x,&y);
if(op){
x=x+umsk-1,y=y+umsk-1;
int sum=vec[y]+vec[x];
for(int tx=x>>1,ty=y>>1; tx!=ty; x=tx,y=ty,tx>>=1,ty>>=1){
if(!(x&1))sum+=vec[x+1];
if(y&1)sum+=vec[y^1];
}
fprintf(fo,"%d\n",sum);
}else{
for(x=x+umsk-1;x;x>>=1)vec[x]-=y;
}
}
return 0;
}