#include<bits/stdc++.h>
#define ll long long
#define ls u<<1
#define rs u<<1|1
using namespace std;
const int N=2e5+5;
int n,Q,a[N],sum;
ll t[N<<2],tag[N<<2];
void build(int u,int l,int r)
{
tag[u]=0;
if(l==r)
{
t[u]=a[l];
return;
}
int mid=(l+r)>>1;
build(ls,1,mid);
build(rs,mid+1,r);
t[u]=t[ls]+t[rs];
}
void f(ll k,int u,int l,int r)
{
tag[u]+=k;
t[u]+=k*(r-l+1);
}
void push_down(int u,int l,int mid,int r)
{
f(tag[u],ls,l,mid);
f(tag[u],rs,mid+1,r);
tag[u]=0;
}
void update(int u,int l,int r,int x,int y,ll k)
{
if(y<l||r<x) return;
if(x<=l&&r<=y)
{
tag[u]+=k;
t[u]+=k*(r-l+1);
return;
}
int mid=(l+r)>>1;
if(tag[u]) push_down(u,l,mid,r);
if(x<=mid) update(ls,l,mid,x,y,k);
if(y>mid) update(rs,mid+1,r,x,y,k);
t[u]=t[ls]+t[rs];
}
ll query(int u,int l,int r,int x,int y)
{
ll res=0;
if(y<l||r<x) return 0;
if(x<=l&&r<=y) return t[u];
int mid=(l+r)>>1;
res=0;
if(tag[u]) push_down(u,l,mid,r);
if(x<=mid) res+=query(ls,l,mid,x,y);
if(y>mid) res+=query(rs,mid+1,r,x,y);
t[u]=t[ls]+t[rs];
return res;
}
int main()
{
scanf("%d%d",&n,&Q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
while(Q--)
{
int opt,x,y,k;
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%d",&x,&y,&k);
update(1,1,n,x,y,k);
}
if(opt==2)
{
scanf("%d",&k);
sum+=k;
}
if(opt==3)
{
scanf("%d",&k);
sum-=k;
}
if(opt==4)
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,1,n,x,y)+(x==1)*sum);
}
if(opt==5)
printf("%lld\n",query(1,1,n,1,1)+sum);
}
return 0;
}
测评记录