#include <map>
#include <queue>
#include <vector>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ls(x) x<<1
#define rs(x) x<<1|1
#define int long long
#define N 200100
using namespace std;
int n,m;
int tree[N<<2],lazy[N<<2],a[N];
void build(int k,int l,int r)
{
lazy[k]=0;
if (l==r)
{
tree[k]=a[l];
return;
}
int mid=(l+r)/2;
build(ls(k),l,mid);
build(rs(k),mid+1,r);
tree[k]=tree[ls(k)]+tree[rs(k)];
}
void push_down(int k,int l,int r)
{
int mid=(l+r)/2;
tree[ls(k)]=tree[ls(k)]+lazy[k]*(mid-l+1);
tree[rs(k)]=tree[rs(k)]+lazy[k]*(r-mid);
lazy[ls(k)]=lazy[ls(k)]+lazy[k];
lazy[rs(k)]=lazy[rs(k)]+lazy[k];
lazy[k]=0;
}
void update(int k,int l,int r,int x,int y,int v)
{
if (x<=l&&r<=y)
{
tree[k]=tree[k]+v*(r-l+1);
lazy[k]=lazy[k]+v;
return;
}
push_down(k,l,r);
int mid=(l+r)/2;
if (x<=mid)
{
update(ls(k),l,mid,x,y,v);
}
if (mid<y)
{
update(rs(k),mid+1,r,x,y,v);
}
tree[k]=tree[ls(k)]+tree[rs(k)];
}
int query(int k,int l,int r,int x,int y)
{
if (x<=l&&r<=y)
{
return tree[k];
}
int mid=(l+r)/2;
int ans=0;
if (x<=mid)
{
ans+=query(ls(k),l,mid,x,y);
}
if (mid<y)
{
ans+=query(rs(k),mid+1,r,x,y);
}
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
for (int i=1;i<=m;i++)
{
int opt,x,y,z;
scanf("%lld",&opt);
if (opt==1)
{
scanf("%lld%lld%lld",&x,&y,&z);
update(1,1,n,x,y,z);
}
if (opt==2)
{
scanf("%lld",&x);
update(1,1,n,1,1,x);
}
if (opt==3)
{
scanf("%lld",&x);
update(1,1,n,1,1,-x);
}
if (opt==4)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,1,n,x,y));
}
if (opt==5)
{
printf("%lld\n",query(1,1,n,1,1));
}
}
return 0;
}
样例过了,自己也看不出哪有问题,求大佬帮忙调错