#include <iostream>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,m,a,b,op,l,r,k;
inline ll read(){
ll X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
if(flag) return X;
return ~(X-1);
}
inline void write(ll X){
if(X<0) putchar('-'),X=~(X-1);
ll s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar('\n');
}
template<class T>
class BIT{
public:
BIT(){}
BIT(int _n){
n=_n;
val=0;
for(int i=1; i<=n; i++){
ca[i]=cb[i]=0;
}
}
void add(int x,int v){
for(int i=x; i<=n; i+=lowbit(i)){
ca[x]+=v;
cb[x]+=v*x;
}
}
T sum(int x){
T res=0;
for(int i=x; i; i-=lowbit(i)){
res+=(i+1)*ca[i]-cb[i];
}
return res;
}
T addfst(T k=0){ // 修改及查询主墓碑的值
return val+=k;
}
private:
T ca[N],cb[N],n,val;
inline T lowbit(T x){
return x&-x;
}
};
int main(){
cin >> n >> m;
n=read(),m=read();
BIT<ll> bit(n); // longlong类型树状数组
for(int i=1; i<=n; i++){
b=read();
bit.add(i,b-a); // 差分
a=b;
}
while(m--){
op=read();
switch(op){
case 1:
l=read(),r=read(),k=read();
bit.add(l,k);
bit.add(r+1,-k); // 区间修改
break;
case 2:
k=read();
bit.addfst(k); // 将主墓碑加上 k
break;
case 3:
k=read();
bit.addfst(-k); // 将主墓碑减去 k
break;
case 4:
// 若包含主墓碑,则加上去
write(bit.sum(r)-bit.sum(l-1)+(l==1)*bit.addfst());
break;
case 5:
// 主墓碑单独维护
write(bit.sum(1)+bit.addfst());
}
}
return 0;
}
可能有点长了(
样例输入完序列就 over 了,交上去也红红黑黑的,求大佬指出错误。