#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;const int maxn=500500;
int n,f,m;int a[maxn];ll q[maxn],la[maxn];int R[maxn],L[maxn];int tag[maxn];
void add(int l,int r,int k)
{
if(tag[l]==tag[r])
{
for(int i=l;i<=r;i++) q[tag[l]]+=k,a[i]+=k;
return;
}
for(int i=tag[i]+1;i<=tag[r]-1;i++) q[i]+=k*(R[i]-L[i]+1),la[i]+=k;
for(int i=l;i<=R[tag[l]];i++) q[tag[i]]+=k,a[i]+=k;
for(int i=L[tag[r]];i<=r;i++) q[tag[i]]+=k,a[i]+=k;
}
ll check(int l,int r)
{
ll ans=0;
if(tag[l]==tag[r])
{
for(int i=l;i<=r;i++) ans+=a[i]+la[tag[i]];
return ans;
}
for(int i=tag[l]+1;i<=tag[r]-1;i++) ans+=q[i];
for(int i=l;i<=R[tag[l]];i++) ans+=a[i]+la[tag[l]];
for(int i=L[tag[r]];i<=r;i++) ans+=a[i]+la[tag[r]];
return ans;
}
int main()
{
cin>>n>>f;
for(int i=1;i<=n;i++) cin>>a[i];
m=sqrt(n);int j=0;
for(int i=1;i<=n;i++)
{
if(i%m==1) L[++j]=i;
if(i==n||i%m==0) R[j]=i;
q[j]+=a[i];
tag[i]=j;
}
int l,r,k,ty;
for(int i=1;i<=f;i++)
{
cin>>ty;if(ty==1)cin>>l>>r>>k;if(ty==2||ty==3)cin>>k;if(ty==4)cin>>l>>r;
if(ty==1) add(l,r,k);
if(ty==2) add(1,1,k);
if(ty==3) add(1,1,-1*k);
if(ty==4) cout<<check(l,r)<<"\n";
if(ty==5) cout<<check(1,1)<<"\n";
// for(int i=1;i<=ceil(n/m);i++) cout<<q[i]<<" ";
// cout<<"\n";
}
//for(int i=1;i<=n;i++) cout<<tag[i]<<" ";
//for(int i=1;i<=j;i++) cout<<q[i]<<" ";
return 0;
}
就只有37~43行和题解不一样了……