实在不知道错哪里了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2000100;
struct node{
ll l,r;
ll sum,add;
}tr[N<<2];
ll w[N];
ll n,m;
#define ls u<<1
#define rs u<<1|1
void lazy(ll u,ll v){
tr[u].sum+=(tr[u].r-tr[u].l+1)*v;
tr[u].add+=v;
}
void down(ll u){
if(tr[u].add){
lazy(ls,tr[u].add),lazy(rs,tr[u].add);
tr[u].add=0;
}
}
void up(ll u){
tr[u].sum=tr[ls].sum+tr[rs].sum;
}
void build(ll u,ll l,ll r){
if(l==r) tr[u]={l,r,w[l],0};
else{
tr[u]={l,r,0,0};
ll mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
up(u);
}
}
void update(ll u,ll l,ll r,ll v){
if(tr[u].l>=l&&tr[u].r<=r) lazy(u,v);
else{
down(u);
ll mid=tr[u].l+tr[u].r>>1;
if(l<=mid) update(ls,l,r,v);
if(r>mid) update(rs,l,r,v);
up(u);
}
}
ll query(ll u,ll l,ll r){
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
ll res=0;
ll mid=tr[u].l+tr[u].r>>1;
if(l<=mid) res+=query(ls,l,r);
if(r>mid) res+=query(rs,l,r);
return res;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) scanf("%lld",&w[i]);
build(1,1,n);
for(ll i=1;i<=m;i++){
ll op;
scanf("%lld",&op);
if(op==1){
ll l,r,d;
scanf("%lld%lld%lld",&l,&r,&d);
update(1,l,r,d);
}else if(op==2){
ll d;
scanf("%lld",&d);
update(1,1,1,d);
}else if(op==3){
ll d;
scanf("%lld",&d);
update(1,1,1,-d);
}else if(op==4){
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(1,l,r));
}else printf("%lld\n",query(1,1,1));
}
return 0;
}