code:
#include<iostream>
#include<cmath>
using namespace std;
int len,id[1000001];
//len=块长 id=第i位对应的块编号
int a[1000001],b[1000001],s[10000001];
//a数组,b标记,s区和
int n,q;
void pl(int l,int r,int x){
int lid=id[l];
int rid=id[r];
if(lid==rid){
for(int i=l;i<=r;i++){
a[i]+=x;
s[id[i]]+=x;
}
}
for(int i=l;id[i]==lid;i++){
a[i]+=x;
s[id[i]]+=x;
}
for(int i=lid+1;i<rid;i++){
b[i]+=x;
s[i]+=x*len;
}
for(int i=r;id[i]==rid;i--){
a[i]+=x;
s[id[i]]+=x;
}
}
int qu(int l,int r){
int lid=id[l];
int rid=id[r];
int ans=0;
if(lid==rid){
for(int i=l;i<=r;i++) ans+=(a[i]+b[i]);
return ans;
}
for(int i=l;id[i]==lid;i++) ans+=(a[i]+b[i]);
for(int i=lid+1;i<rid;i++) ans+=s[i];
for(int i=r;id[i]==rid;i--) ans+=(a[i]+b[i]);
return ans;
}
int main(){
cin>>n>>q;
int len=sqrt(n);
int cnt=0;
int sum=1;
for(int i=1;i<=n;i++){
cin>>a[i];
if(cnt==len) cnt=0,sum++;
cnt++;
id[i]=sum;
s[id[i]]+=a[i];
}
/*for(int i=1;i<=n;i++){
cout<<id[i]<<" ";
}
cout<<endl;
int debug=0;*/
while(q--){
int op;
cin>>op;
if(op==1){
int l,r,x;
cin>>l>>r>>x;
pl(l,r,x);
/*cout<<"debug step "<<++debug<<":";
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;*/
}else{
int l,r;
cin>>l>>r;
cout<<qu(l,r)<<endl;
}
}
return 0;
}