这题刚开始按某站的视频打了一遍,运行错误,又按题解改了一下,还是运行错误,程序运行到输入完data数组不行了,找了快一个小时了!救救本蒟蒻吧QwQ
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100000+10, INF=0x3f3f3f3f;
struct node{
ll l,r,lazy;
ll ans;
}tree[5*N];
ll data[N];
ll n,m;
inline void buildtree(ll i,ll l,ll r){
ll mid;
tree[i].l=l;
tree[i].r=r;
if(l==r){
tree[i].ans=data[l];
return;
}
mid=(l+r)/2;
buildtree(i*2,l,m);
buildtree(i*2+1,m+1,r);
tree[i].ans=tree[i*2].ans+tree[i*2+1].ans;
}
inline void pushdown(ll i){
tree[i*2].lazy+=tree[i].lazy;
tree[i*2].ans+=tree[i].lazy*(tree[i*2].r-tree[i*2].l+1);
tree[i*2+1].lazy+=tree[i].lazy;
tree[i*2+1].ans+=tree[i].lazy*(tree[i*2+1].r-tree[i*2+1].l+1);
tree[i].lazy=0;
}
inline void change(ll i,ll l,ll r,ll k){
if(tree[i].l>r || tree[i].r<l) return;
if(tree[i].r<=r&&tree[i].l>=l){
tree[i].ans+=k*(tree[i].r-tree[i].l+1);
tree[i].lazy+=k;
return;
}
if(tree[i].lazy>0)pushdown(i);
change(i*2,l,r,k);
change(i*2+1,l,r,k);
tree[i].ans=tree[i*2].ans+tree[i*2+1].ans;
}
inline int ask(ll i,ll l,ll r){
if(tree[i].r<l||tree[i].l>r)return 0;
if(tree[i].r<=r&&tree[i].l>=l){
return tree[i].ans;
}
if(tree[i].lazy>0)pushdown(i);
return ask(i*2,l,r)+ask(i*2+1,l,r);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>data[i];
buildtree(1,1,n);
for(int i=1;i<=m;++i){
int op;cin>>op;
if(op==1){
int x,y,k;cin>>x>>y>>k;
change(1,x,y,k);
}
else{
int x,y;cin>>x>>y;
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}