代码如下
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
ll lazy,sum;
ll l,r;
}block[200100];
ll vis[200100];
ll n,f;
ll a[200100];
ll len;
ll opt,l,r,k;
ll blocks=1,times=0;
int main(){
cin>>n>>f;
len=sqrt(n);
for (int i=1;i<=n;i++){
times++;
vis[i]=blocks;
if (times>=len){
blocks++;
times=0;
}
}
for (int i=1;i<=n;i++){
cin>>a[i];
block[vis[i]].sum+=a[i];
}
for (int i=1;i<=2e5;i++){
block[i].l=2e5;
block[i].r=2e5;
}
for (int i=1;i<=n;i+=len){
block[vis[i]].l=i;
block[vis[i]].r=i+len-1;
//cout<<block[vis[i]].l<<" "<<block[vis[i]].r<<endl;
}
block[vis[n]].l=(vis[n]-1)*len+1;
block[vis[n]].r=vis[n]*len;
while(f--){
cin>>opt;
if (opt==1){
cin>>l>>r>>k;
ll L=vis[l];
ll R=vis[r];
if ((l-1)%len!=0)
L++;
if (r%len!=0)
R--;
for (int i=L;i<=R;i++){
block[i].lazy+=k;
//cout<<i<<endl;
}
for (int i=l;i<=block[L-1].r;i++){
a[i]+=k;
block[L-1].sum+=k;
//cout<<"???2\n";
}
for (int i=block[R+1].l;i<=r;i++){
a[i]+=k;
block[R+1].sum+=k;
//cout<<"???1\n";
}
}else if (opt==2){
cin>>k;
a[1]+=k;
block[1].sum+=k;
}else if (opt==3){
cin>>k;
a[1]-=k;
block[1].sum-=k;
}else if (opt==4){
cin>>l>>r;
ll L=vis[l];
ll R=vis[r];
if ((l-1)%len!=0)
L++;
if (r%len!=0)
R--;
ll ans=0;
for (int i=L;i<=R;i++){
ans+=block[i].sum;
ans+=len*block[i].lazy;
}
for (int i=l;i<=block[L-1].r;i++){
ans+=a[i];
ans+=block[L-1].lazy;
}
for (int i=block[R+1].l;i<=r;i++){
ans+=a[i];
ans+=block[R+1].lazy;
}
cout<<ans<<endl;
}else if (opt==5){
cout<<a[1]+block[1].lazy<<endl;
}
// for (int i=1;i<=n;i++)
// cout<<a[i]+block[vis[i]].lazy<<" ";
// cout<<endl;
}
}