rt 工作量很大,所以谢谢了(会关
#include <bits/stdc++.h>
#define MAXN 100005
#define ll long long
using namespace std;
ll n,m,a[MAXN];
struct node{
ll l,r,tag,add;
}tree[MAXN*4];
void build(ll l,ll r,ll id){
tree[id].l=l;
tree[id].r=r;
if(l==r){
tree[id].add=a[l];
return;
}
ll mid=l+r>>1;
build(l,mid,id<<1);
build(mid+1,r,id<<1||1);
tree[id].add=tree[id<<1].add+tree[id<<1||1].add;
}
void push_down(ll id){
tree[id<<1].tag+=tree[id].tag;
tree[id<<1].add+=(tree[id<<1].r-tree[id<<1].l+1)*tree[id].tag;
tree[id<<1||1].tag+=tree[id].tag;
tree[id<<1||1].add+=(tree[id<<1||1].r-tree[id<<1||1].l+1)*tree[id].tag;
tree[id].tag=0;
}
void update(ll l,ll r,ll id,ll k){
if(tree[id].l>r||tree[id].r<l) return;
if(tree[id].l>=l&&tree[id].r<=r){
tree[id].tag+=k;
tree[id].add+=(tree[id].r-tree[id].l+1)*k;
return;
}
if(tree[id].tag>0) push_down(id);
update(l,r,id<<1,k);
update(l,r,id<<1||1,k);
tree[id].add=tree[id<<1].add+tree[id<<1||1].add;
}
ll query(ll l,ll r,ll id){
if(tree[id].l>r||tree[id].r<l) return 0;
if(tree[id].l>=l&&tree[id].r<=r) return tree[id].add;
if(tree[id].tag>0) push_down(id);
return query(l,r,id<<1)+query(l,r,id<<1||1);
}
int main(){
ll pos,x,y,k;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,n,1);
while(m--){
scanf("%lld",&pos);
if(pos==1){
scanf("%lld %lld %lld",&x,&y,&k);
update(x,y,1,k);
}
else{
scanf("%lld %lld",&x,&y);
printf("%lld\n",query(x,y,1));
}
}
return 0;
}