rt
#include <cstdio>
#define int long long
#define MAXN 100005
using namespace std;
int n,m;
int a[MAXN];
int tag[MAXN<<2];
int t[MAXN<<2];
inline int ls(int p) {return p<<1;}
inline int rs(int p) {return p<<1|1;}
inline int push_up(int p) {t[p]=t[ls(p)]+t[rs(p)];}
inline void build(int l,int r,int p) {
tag[p]=0;
if(l==r) {t[p]=a[l]; return ;}
int mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
inline void f(int l,int r,int p,int k) {
tag[p]=tag[p]+k;
t[p]=t[p]+(r-l+1)*k;
}
inline void push_down(int l,int r,int p) {
int mid=(l+r)>>1;
f(l,mid,ls(p),tag[p]);
f(mid+1,r,rs(p),tag[p]);
tag[p]=0;
}
inline void update(int l,int r,int p,int k,int ql,int qr) {
if(ql<=l&&qr>=r) {
tag[p]+=k;
t[p]+=k*(r-l+1);
return ;
}
push_down(l,r,p);
int mid=(l+r)>>1;
if(ql<=mid) update(l,mid,ls(p),k,ql,qr);
if(qr>mid) update(mid+1,r,rs(p),k,ql,qr);
push_up(p);
}
inline int query(int l,int r,int p,int ql,int qr) {
int res=0;
if(ql<=l&&qr>=r) return t[p];
int mid=(l+r)>>1;
push_down(l,r,p);
if(ql<=mid) res+=query(l,mid,ls(p),ql,qr);
if(qr>mid) res+=query(mid+1,r,rs(p),ql,qr);
return res;
}
signed main() {
scanf("%lld%lld",&n,&m);
for(register int i=1;i<=n;++i) scanf("%lld",a+i);
build(1,n,1);
while(m--) {
int opt,x,y,k;
scanf("%lld",opt);
if(opt==1) {
scanf("%lld%lld%lld",&x,&y,&k);
update(1,n,1,k,x,y);
} else {
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,n,1,x,y));
}
}
return 0;
}
似乎是爆栈了,请问哪里有问题?