lansuren @ 2023-04-12 01:22:51
#include <bits/stdc++.h>
using namespace std;
#define lc k<<1
#define rc k<<1|1
#define ll long long
const int maxn=100005;
ll n,m;
ll p,q,r,s,a[maxn+2];
struct node{
ll l,r,sum,lazy;
}tree[maxn*4+2];
void pushup(ll k){
tree[k].sum=tree[lc].sum+tree[rc].sum;
}
void build_tree(ll k,ll l,ll r){
tree[k].l=l;
tree[k].r=r;
if(l==r){
tree[k].sum=a[l];
return;
}
ll mid=(l+r)>>1;
build_tree(lc,l,mid);
build_tree(rc,mid+1,r);
pushup(k);
}
void pushdown(ll k){
if (tree[k].lazy){
tree[lc].lazy+=tree[k].lazy;
tree[lc].sum+=(tree[lc].r-tree[lc].l+1)*tree[k].lazy;
tree[rc].lazy+=tree[k].lazy;
tree[rc].sum+=(tree[rc].r-tree[rc].l+1)*tree[k].lazy;
tree[k].lazy=0;
}
}
void modify(ll k,ll l,ll r,ll s){
if(tree[k].l>=l && tree[k].r<=r){
tree[k].lazy+=s;
tree[k].sum+=(tree[k].r-tree[k].l+1)*s;
return;
}
pushdown(k);
ll mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) modify(lc,l,r,s);
if(r>mid) modify(rc,l,r,s);
pushup(k);
}
int query(ll k,ll l,ll r){
if(l<=tree[k].l && tree[k].r<=r){
return tree[k].sum;
}
pushdown(k);
ll mid=(tree[k].l+tree[k].r)>>1;
ll res=0;
if(l<=mid) res += query(lc,l,r);
if(r>mid) res += query(rc,l,r);
return res;
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>a[i];
}
build_tree(1,1,n);
for(ll i=1;i<=m;i++){
cin>>p;
if(p==1){
cin>>q>>r>>s;
modify(1,q,r,s);
}
else{
cin>>q>>r;
cout<<query(1,q,r)<<endl;
}
}
return 0;
}
by yizhiming @ 2023-04-12 06:39:34
@lansuren query返回值改成 long long 就好了
by lansuren @ 2023-04-12 09:06:16
@yizhiming 大佬起的好早,感谢!