7MLE
,3RE
#include<algorithm>
using namespace std;
const int N=1000000;
int v[4*N],a[N],d[4*N];
void build(int x,int l,int r)
{
if (l==r) {
v[x]=a[l];
return ;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
v[x]=v[x*2]+v[x*2+1];
}
int point_query(int x,int l,int r,int y)
{
if (l==r) return v[x];
int mid=(l+r)/2;
if (y<=mid) return point_query(x*2,l,mid,y);
else return point_query(x*2+1,mid+1,r,y);
}
int line_query(int x,int l,int r,int ql,int qr)
{
if (l==ql&&r==qr) return v[x];
int mid=(l+r)/2;
if (ql<=mid&&qr>mid) return line_query(x*2,l,mid,ql,mid)+line_query(x*2+1,mid+1,r,mid+1,qr);
else if (qr<=mid) return line_query(x*2,l,mid,ql,qr);
else return line_query(x*2+1,mid+1,r,ql,qr);
}
void push_down(int x,int l,int r,int mid)
{
if (d[x]==0) return ;
d[x*2]+=d[x];
v[x*2]+=d[x]*(mid-l+1);
d[x*2+1]+=d[x];
v[x*2+1]+=d[x]*r-mid;
d[x]=0;
}
void add_modify(int x,int l,int r,int ql,int qr,int z)
{
if (l==ql&&r==qr) {
v[x]+=z*(r-l+1);
d[x]+=z;
return ;
}
int mid=(l+r)/2;
push_down(x,l,r,mid);
if (ql<=mid&&qr>mid) {
add_modify(x*2,l,mid,ql,mid,z);
add_modify(x*2+1,mid+1,r,mid+1,qr,z);
}
else if (qr<=mid) add_modify(x*2,l,mid,ql,qr,z);
else add_modify(x*2+1,mid+1,r,ql,qr,z);
v[x]=v[x*2]+v[x*2+1];
}
int main()
{
int n,m;
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>a[i];
int x,y,z,k;
build(1,1,n);
for (int i=0;i<m;i++) {
cin>>x;
if (x==1) {
cin>>y,z,k;
add_modify(1,y,z,1,n,k);
}
else {
cin>>y,z;
cout<<line_query(1,y,z,1,n)<<endl;
}
}
return 0;
}