好像没有人是我这种情况(评测记录)
#include<iostream>
#define int long long
using namespace std;
const int N =10000;
struct node{
int l,r,sum,lazy;
};
int a[N],n,q;node tree[5*N];
inline int build(int num,int l,int r){
tree[num].l=l;tree[num].r=r;
if(l==r){
tree[num].sum=a[l];
return tree[num].sum;
}
int mid=(l+r)/2;
tree[num].sum=build(num*2,l,mid)+build(num*2+1,mid+1,r);
return tree[num].sum;
}
int ans_l,ans_r;
inline void add(int num,int k){
int l=tree[num].l,r=tree[num].r,mid=(l+r)/2;
if(ans_r<l||r<ans_l)return;
if(ans_l<=l&&ans_r>=r){
tree[num].lazy+=k;
return;
}
if(ans_l<=mid)add(num*2,k);
if(ans_r>=mid+1)add(num*2+1,k);
if(ans_l>=l&&ans_r<r)tree[num].sum+=(ans_r-ans_l+1)*k;
if(ans_l<=l&&ans_r<r)tree[num].sum+=(ans_r-l+1)*k;
if(ans_r>=r&&l<ans_l)tree[num].sum+=(r-ans_l+1)*k;
}
inline int sum(int num){
int l=tree[num].l,r=tree[num].r,mid=(l+r)/2,ans=0;
if(ans_l<=l&&ans_r>=r){
return tree[num].sum+(r-l+1)*(tree[num].lazy);
}
if(tree[num].lazy!=0){
tree[num*2].lazy+=tree[num].lazy;
tree[num*2+1].lazy+=tree[num].lazy;
tree[num].sum+=(r-l+1)*(tree[num].lazy);
tree[num].lazy=0;
}
if(ans_l<=mid)ans+=sum(num*2);
if(ans_r>=mid+1)ans+=sum(num*2+1);
return ans;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
int moss;cin>>moss;
cin>>ans_l>>ans_r;
if(moss==1){
int k;cin>>k;
add(1,k);
}else{
cout<<sum(1)<<endl;
}
}
return 0;
}