#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void rd(T &s){
T f=1;char ch=getchar();s=0;
while(!isdigit(ch))f=(ch=='-')?-1:1,ch=getchar();
while(isdigit(ch))s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
s*=f;
}
typedef long long ll;
const int M=100010;
int n,m;
ll tree[M<<2],add[M<<2],a[M];
#define ls k<<1
#define rs k<<1|1
#define mid (l+r)/2
inline void build(int k,int l,int r){
if(l==r){
tree[k]=a[l];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
tree[k]=tree[ls]+tree[rs];
}
inline void pushdown(int k,int l,int r){
if(!add[k])return;
tree[ls]+=(mid-l+1)*add[k];
tree[rs]+=(r-mid)*add[k];
add[ls]+=add[k];
add[rs]+=add[k];
add[k]=0;
}
inline void update(int k,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
tree[k]+=(r-l+1)*v;
add[k]+=v;
return;
}
pushdown(k,l,r);
if(x<=mid)update(ls,l,mid,x,y,v);
if(y>mid)update(rs,mid+1,r,x,y,v);
tree[k]=tree[ls]+tree[rs];
}
inline ll query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)return tree[k];
pushdown(k,l,r);
ll ans=0;
if(x<=mid)ans+=query(ls,l,mid,x,y);
if(y>mid)ans+=query(rs,mid+1,r,x,y);
return ans;
}
int main(){
rd(n),rd(m);
for(int i=1;i<=n;i++)rd(a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y,v;
rd(op),rd(x),rd(y);
if(op==1){
rd(v);
update(1,1,n,x,y,v);
}
else{
printf("%lld\n",query(1,1,n,x,y));
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void rd(T &s){
T f=1;char ch=getchar();s=0;
while(!isdigit(ch))f=(ch=='-')?-1:1,ch=getchar();
while(isdigit(ch))s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
s*=f;
}
typedef long long ll;
const int M=100010;
int n,m;
ll tree[M<<2],add[M<<2],a[M];
#define ls k<<1
#define rs k<<1|1
#define mid l+r>>1
inline void build(int k,int l,int r){
if(l==r){
tree[k]=a[l];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
tree[k]=tree[ls]+tree[rs];
}
inline void pushdown(int k,int l,int r){
if(!add[k])return;
tree[ls]+=(mid-l+1)*add[k];
tree[rs]+=(r-mid)*add[k];
add[ls]+=add[k];
add[rs]+=add[k];
add[k]=0;
}
inline void update(int k,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
tree[k]+=(r-l+1)*v;
add[k]+=v;
return;
}
pushdown(k,l,r);
if(x<=mid)update(ls,l,mid,x,y,v);
if(y>mid)update(rs,mid+1,r,x,y,v);
tree[k]=tree[ls]+tree[rs];
}
inline ll query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)return tree[k];
pushdown(k,l,r);
ll ans=0;
if(x<=mid)ans+=query(ls,l,mid,x,y);
if(y>mid)ans+=query(rs,mid+1,r,x,y);
return ans;
}
int main(){
rd(n),rd(m);
for(int i=1;i<=n;i++)rd(a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y,v;
rd(op),rd(x),rd(y);
if(op==1){
rd(v);
update(1,1,n,x,y,v);
}
else{
printf("%lld\n",query(1,1,n,x,y));
}
}
return 0;
}
为何将 #define mid l+r>>1 改为 #define mid (l+r)/2 代码就对了呢?