#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n,m,num[100005];
struct node{
ll l;
ll r;
ll sum;
ll tag;
};
struct node xdtree[400005];
void build(ll p,ll l,ll r){
xdtree[p].l=l;
xdtree[p].r=r;
if(l==r){
xdtree[p].sum=num[l];
return;
}
ll mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
xdtree[p].sum=xdtree[p*2].sum+xdtree[p*2+1].sum;
return;
}
void spread(ll p){
if(xdtree[p].tag){
xdtree[p*2].sum+=xdtree[p].tag*(xdtree[p*2].l-xdtree[p*2].r+1);
xdtree[p*2+1].sum+=xdtree[p].tag*(xdtree[p*2+1].l-xdtree[p*2+1].r+1);
xdtree[p*2].tag+=xdtree[p].tag;
xdtree[p*2+1].tag+=xdtree[p].tag;
xdtree[p].tag=0;
}
return;
}
void change(ll p,ll l,ll r,ll d){
if(l<=xdtree[p].l&&r>=xdtree[p].r){
xdtree[p].sum+=(ll)d*(xdtree[p].r-xdtree[p].l+1);
xdtree[p].tag+=d;
return;
}
spread(p);
ll mid=(xdtree[p].l+xdtree[p].r)/2;
if(l<=mid){
change(p*2,l,r,d);
}
if(r>mid){
change(p*2+1,l,r,d);
}
xdtree[p].sum=xdtree[p*2].sum+xdtree[p*2+1].sum;
return;
}
ll ask(ll p,ll l,ll r){
if(l<=xdtree[p].l&&r>=xdtree[p].r){
return xdtree[p].sum;
}
spread(p);
ll mid=(xdtree[p].l+xdtree[p].r)/2;
ll val=0;
if(l<=mid){
val+=ask(p*2,l,r);
}
if(r>mid){
val+=ask(p*2+1,l,r);
}
return val;
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>num[i];
}
build(1,1,n);
for(ll i=1;i<=m;i++){
ll op=0;
cin>>op;
if(op==1){
ll x=0,y=0,k=0;
cin>>x>>y>>k;
change(1,x,y,k);
}
else{
ll l=0,r=0;
cin>>l>>r;
cout<<ask(1,l,r)<<endl;
}
}
return 0;
}
RT,不知道哪里写挂了,样例就是过不了……
望高人指点!