Cynun @ 2022-11-04 20:50:10
#include<iostream>
#define MAXN 114514
#define ll long long
using namespace std;
ll a[MAXN],st[MAXN*4],tag[MAXN*4];
inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}
void pushup(int p){st[p]=st[lc(p)]+st[rc(p)];}
void build(ll l,ll r,ll p){
if(l==r)st[p]=a[l];return;
int m=(l+r)>>1;
build(l,m,p*2);build(m+1,r,p*2+1);
pushup(p);
}
void f(ll p,ll l,ll r,ll k){//quick moditfy
tag[p]+=k;
st[p]+=k*(r-l-1);
}
void pushdown(ll p,ll l,ll r){
ll m=(l+r)>>1;
f(p*2,l,m,tag[p]);
f(p*2+1,m+1,r,tag[p]);
tag[p]=0;
}
void upd(ll ml,ll mr,ll l,ll r,ll p,ll k){
if(ml<=l&&r<=mr)f(p,l,r,k);
pushdown(p,l,r);
ll m=(l+r)>>1;
if(ml<=m)upd(ml,mr,l,m,p*2,k);
if(mr>m)upd(ml,mr,m+1,r,p*2+1,k);
}
ll qry(ll qx,ll qy,ll l,ll r,ll p){
ll res=0;
if(qx<=l&&r<=qy)return st[p];
ll m=(l+r)>>1;
pushdown(p,l,r);
if(qx<=m)res+=qry(qx,qy,l,m,p*2);
if(qy>m)res+=qry(qx,qy,m+1,r,p*2+1);
return res;
}
int main(void){
ll a1,b,c,d,e,f,n,m;
cin>>n>>m;
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
scanf("%lld",&a1);
switch(a1){
case 1:{
scanf("%lld%lld%lld",&b,&c,&d);
upd(b,c,1,n,1,d);
break;
}
case 2:{
scanf("%lld%lld",&e,&f);
printf("%lld\n",qry(e,f,1,n,1));
break;
}
}
}
return 0;
}
蒟蒻学线段树断断续续有1个月了,还是写不对/kk
by Cynun @ 2022-11-11 19:00:25
@HBWH_zzz A了,感谢/kk