#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));
}
}
}树状数组 区间修改 区间查询
最新推荐文章于 2023-02-08 14:31:07 发布
本文介绍了一种使用线段树和差分更新技巧实现的区间修改与查询算法。该算法能够高效处理一系列区间加法操作及区间的求和查询,特别适用于解决动态规划问题中的区间更新与查询任务。
2193

被折叠的 条评论
为什么被折叠?



