这道题30分,求dalao调
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
typedef long long ll;
const int MAXN=1e6+10;
ll xh[MAXN];
struct tree{
int l,r;
ll val,lazy;
};
struct seg{
tree t[MAXN<<3];
il void pu(int x){
t[x].val=t[ls(x)].val+t[rs(x)].val;
return;
}
il void pd(int x){
if(t[x].lazy==0){
return;
}
t[ls(x)].val+=(t[ls(x)].r-t[ls(x)].l+1)*t[x].lazy;
t[rs(x)].val+=(t[ls(x)].r-t[ls(x)].l+1)*t[x].lazy;
t[ls(x)].lazy+=t[x].lazy;
t[rs(x)].lazy+=t[x].lazy;
t[x].lazy=0;
return;
}
il void build(int l,int r,int x){
t[x].l=l,t[x].r=r;
if(l==r){
t[x].val=xh[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,ls(x)),build(mid+1,r,rs(x));
pu(x);
return;
}
ll ask(int l,int r,int x){
if(t[x].r<l||t[x].l>r){
return 0;
}
if(t[x].l>=l&&t[x].r<=r){
return t[x].val;
}
pd(x);
return ask(l,r,ls(x))+ask(l,r,rs(x));
}
il void add(int l,int r,ll k,int x){
if(t[x].r<l||t[x].l>r){
return;
}
if(t[x].l>=l&&t[x].r<=r){
t[x].val+=(t[x].r-t[x].l+1)*k;
t[x].lazy+=k;
return;
}
pd(x);
add(l,r,k,ls(x)),add(l,r,k,rs(x));
pu(x);
return;
}
}s;
int main(){
int x,h,l,r;
ll k;
cin>>x>>h;
for(int i=1;i<=x;i++){
cin>>xh[i];
}
s.build(1,x,1);
for(int i=1;i<=h;i++){
int j;
cin>>j;
switch(j){
case 1:
cin>>l>>r>>k;
s.add(l,r,k,1);
break;
case 2:
cin>>l>>r;
cout<<s.ask(l,r,1)<<"\n";
break;
}
}
return 0;
}