线段树做法,RT。
感谢各位大佬(
#include <bits/stdc++.h>
#define Heriko return
#define Deltana 0
#define S signed
#define LL long long
#define R register
#define I inline
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define CI const int
#define mst(a, b) memset(a, b, sizeof(a))
#define ON std::ios::sync_with_stdio(false)
using namespace std;
I void fr(LL & x)
{
LL f=1;
char c=getchar();
x=0;
while(c<'0' or c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while (c>='0' and c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
x*=f;
}
I void fw(LL x)
{
if(x<0) putchar('-'),x=-x;
static LL stak[35];
LL top=0;
do
{
stak[top++]=x%10;
x/=10;
}
while(x);
while(top) putchar(stak[--top]+'0');
putchar('\n');
}
CI MXX=5e6+5;
LL n,m;
struct node
{
LL val,add;
}
t[MXX];
I void pushup(LL x)
{
t[x].val=t[lc(x)].val+t[rc(x)].val;
}
void build(LL x,LL l,LL r)
{
t[x].add=0;
if(l==r) {fr(t[x].val);Heriko;}
LL mid=(l+r)>>1;
build(lc(x),l,mid);
build(lc(x),mid+1,r);
pushup(x);
}
I void pushdown(LL x,LL l)
{
t[lc(x)].val=t[lc(x)].val+t[x].add*(l-(l>>1));
t[rc(x)].val=t[rc(x)].val+t[x].add*(l>>1);
t[lc(x)].add+=t[x].add;
t[rc(x)].add+=t[x].add;
t[x].add=0;
}
void add(LL rt,LL l,LL r,LL x,LL y,LL val)
{
if(x<=l and r<=y)
{
t[rt].add+=val;
t[rt].val+=val*(r-l+1);
Heriko;
}
pushdown(rt,r-l+1);
LL mid=(l+r)>>1;
if(x<=mid) add(lc(rt),l,mid,x,y,val);
if(y>mid) add(rc(rt),mid+1,r,x,y,val);
pushup(rt);
}
LL query(LL rt,LL l,LL r,LL x,LL y)
{
if(x<=l and r<=y) Heriko t[rt].val;
LL mid=(l+r)>>1,ans=0;
if(x<=mid) ans+=query(lc(rt),l,mid,x,y);
if(y>mid) ans+=query(rc(rt),mid+1,r,x,y);
Heriko ans;
}
LL a,b,c,d;
S main()
{
fr(n),fr(m);
build(1,1,n);
while(m--)
{
fr(a);
if(a==1) fr(b),fr(c),fr(d),add(1,1,n,b,c,d);
else if(a==2) fr(b),add(1,1,n,1,1,b);
else if(a==3) fr(b),add(1,1,n,1,1,-b);
else if(a==4) fr(b),fr(c),fw(query(1,1,n,b,c));
else fw(query(1,1,n,1,1));
}
Heriko Deltana;
}