请各位大佬帮忙看看啊,问题如标题所示↓
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#define ll long long
using namespace std;
const int MAXN=1e5+10;
int n,m;
ll a[MAXN]={0},tree[4*MAXN],tag[4*MAXN];
inline int ls(int x){
return x<<1;
}
inline int rs(int x){
return x<<1|1;
}
inline void sum(int p){
tree[p]=tree[ls(p)]+tree[rs(p)];
}
inline void build(int p,int l,int r){
if(l==r){
tree[p]=a[l];
return ;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
sum(p);
}
inline void lazy_tag(int p,int l,int r,ll w){
tag[p]+=w;
tree[p]+=w*(r-l+1);
}
inline void push_down(int p,int l,int r){
int mid=(l+r)>>1;
lazy_tag(ls(p),l,mid,tag[p]);
lazy_tag(rs(p),mid+1,r,tag[p]);
tag[p]=0;
}
inline ll query(int p,int l,int r,int L,int R){
if(L<=l&&r<=R){
return tree[p];
}
ll ans=0;
int mid=(l+r)>>1;
push_down(p,l,r);
if(L<=mid)ans+=query(ls(p),l,mid,L,R);
if(R>mid)ans+=query(rs(p),mid+1,r,L,R);
return ans;
}
inline void update(int p,int l,int r,int L,int R,ll w){
if(L<=l&&r<=R){
tree[p]+=w*(r-l+1);
tag[p]+=w;
return ;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(L<=mid)update(ls(p),l,mid,L,R,w);
if(R>mid)update(rs(p),mid+1,r,L,R,w);
sum(p);
}
int main(){
memset(tree,0,sizeof(tree));
memset(tag,0,sizeof(tag));
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,1,n);
int opt,x,y;
ll k;
while(m--){
scanf("%d%d%d",&opt,&x,&y);
if(opt==1){
scanf("%d",&k);
update(1,1,n,x,y,k);
}
else {
printf("%lld\n",query(1,1,n,x,y));
}
}
return 0;
}
希望各位大佬能给出解决方案!