rt,样例一直输出0,7,7
#include<iostream>
#define int long long
using namespace std;
const int MAXN=1e6+3;
struct T{
int sum,tag;
}tree[MAXN<<2];
int a[MAXN];
void lazy(int now,int l,int r,int n){
tree[now].tag+=n;
tree[now].sum+=n*(r-l+1);
}
void pushup(int now){
tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}
void pushdown(int now,int l,int r){
int mid=(l+r)>>1;
lazy(now<<1,l,mid,tree[now].tag);
lazy(now<<1|1,mid+1,r,tree[now].tag);
tree[now].tag=0;
}
void build(int now,int l,int r){
if(l==r){
tree[now].sum=a[l];
}else{
int mid=(l+r)>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
pushup(now);
}
}
void modify(int now,int l,int r,int x,int y,int n){
if(x<=l&&r<=y){
tree[now].sum+=n*(r-l+1);
tree[now].tag+=n;
return;
}
pushdown(now,l,r);
int mid=(l+r)>>1;
if(x<=mid){
modify(now<<1,l,mid,x,y,n);
}
if(mid+1<=y){
modify(now<<1|1,mid+1,r,x,y,n);
}
pushup(now);
}
int query(int now,int l,int r,int x,int y){
int ans=0;
if(x<=l&&r<=y){
return tree[now].sum;
}
int mid=(l+r)>>1;
pushdown(now,l,r);
if(x<=mid){
ans+=query(now<<1,x,y,l,mid);
}
if(mid+1<=y){
ans+=query(now<<1|1,x,y,mid+1,r);
}
return ans;
}
signed main(){
int n,m;
int x,y,k,type;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(m--){
scanf("%lld",&type);
switch(type){
case 1:
scanf("%lld%lld%lld",&x,&y,&k);
modify(1,1,n,x,y,k);
break;
case 2:
scanf("%lld%lld",&x,&y);
cout<<query(1,1,n,x,y)<<endl;
break;
}
}
return 0;
}