```cpp
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
long long n,m;
const long long M = 100005;
long long dx[M];
long long l[M],r[M];
long long a[M];
long long belong[M];
long long lazy[M];
long long bg,sum;
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void buildd(){
bg=sqrt(n);
sum=n/bg;
if(n%bg)
sum++;
for(int i=1;i<=sum;i++)
l[i]=(i-1)*bg+1,r[i]=i*bg;
r[sum]=n;
for(int i=1;i<=n;i++)
belong[i]=(i-1)/bg+1;
for(int i=1;i<=sum;i++)
for(int j=l[i];j<=r[i];j++)
dx[i]+=a[j];
return;
}
inline void updata(long long x,long long y,long long k){
if(belong[x]==belong[y]){
for(int i=x;i<=y;i++)
a[i]+=k;
dx[belong[x]]+=(y-x+1)*k;
}
else{
{
for(int i=x;i<=r[belong[x]];i++)
a[i]+=k;
dx[belong[x]]+=(r[belong[x]]-x+1)*k;
}
for(int i=belong[x]+1;i<=belong[y]-1;i++)
lazy[i]+=k,dx[i]+=(r[i]-l[i]+1)*k;
{
for(int i=l[belong[y]];i<=y;i++)
a[i]+=k;
dx[belong[y]]+=(y-l[belong[y]]+1)*k;
}
}
return;
}
long long query(long long x,long long y){
long long ans=0;
if(belong[x]==belong[y]){
for(int i=x;i<=y;i++)
ans+=a[i];
}
else{
for(int i=x;i<=r[belong[x]];i++)
ans+=a[i];
for(int i=belong[x]+1;i<=belong[y]-1;i++){
ans+=dx[i];
}
for(int i=l[belong[y]];i<=y;i++)
ans+=a[i];
ans+=lazy[belong[x]]*(r[belong[x]]-x+1);
ans+=lazy[belong[y]]*(y-l[belong[y]]+1);
}
return ans;
}
int main(){
//freopen("P3372_8.in","r",stdin);
//freopen("P3372_8.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
buildd();
long long qqq;
for(int i=1;i<=m;i++){
qqq=read();
if(qqq==1){
long long x,y,k;
x=read(),y=read(),k=read();
updata(x,y,k);
}
if(qqq==2){
long long wh,jjj;
wh=read(),jjj=read();
printf("%lld\n",query(wh,jjj));
}
}
return 0;
}
```
帮你魔改了一下 @[Chase_future](/user/241817)
by peterwuyihong @ 2021-09-21 14:40:50
@[peterwuyihong](/user/100325) 谢神仙啦,我自己看看
by Chancylaser @ 2021-09-21 14:48:38