#include<stdio.h>
#include<ctype.h>
#define lowbit(x) (x&-x)
#define LL long long
#define N 100005
int n,q,x,y,z;
LL a0[N],a1[N],a2[N];
char c;
void read(int &t) {
t=0; int f=1;
for(;!isdigit(c=getchar());) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) t=(t<<3)+(t<<1)+c-'0';
t*=f;
}
void update(LL *a,int p,int v) {
for(;p<=n;p+=lowbit(p)) a[p]+=v;
}
LL query(LL *a,int p) {
LL ret=0;
for(;p;p-=lowbit(p)) ret+=a[p];
return ret;
}
int main() {
read(n), read(q);
for(int i=1;i<=n;i++) {
read(x);
a0[i]=a0[i-1]+x;
}
while(q--) {
while(isspace(c=getchar()));
if(c=='2') {
read(x), read(y);
printf("%lld\n",
a0[y]+(y+1)*query(a1,y)-query(a2,y)
-a0[x-1]-x*query(a1,x-1)+query(a2,x-1)
);
}
else {
read(x), read(y), read(z);
update(a1,x,z);
update(a1,y+1,-z);
update(a2,x,z*x);
update(a2,y+1,-z*(y+1));
}
}
}
树状数组 区间修改 区间查询
最新推荐文章于 2022-04-15 14:11:36 发布