MornHus @ 2023-03-31 21:25:42
#include<bits/stdc++.h>
using namespace std;
long long read(){
long long x=0;
long long f=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
int n,m;
long long tree[100001<<2];
long long lazy[100001<<2];
void pushup(int k){
tree[k]=tree[k<<1]+tree[k<<1|1];
}
void build(int k,int l,int r){
if(l==r){
tree[k]=read();
}else{
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
}
void pushdown(int k,int l,int r){
if(lazy[k]){
int mid=(l+r)>>1;
lazy[k<<1]+=lazy[k];
lazy[k<<1|1]+=lazy[k];
tree[k<<1]+=lazy[k]*(mid-l+1);
tree[k<<1|1]+=lazy[k]*(r-mid);
lazy[k]=0;
}
}
void update(int L,int R,int l,int r,int k,long long val){
if(L<=l&&r<=R){
tree[k]+=(r-l+1)*val;
lazy[k]+=val;
}else{
int mid=(l+r)>>1;
pushdown(k,l,r);
if(L<=mid){
update(L,R,l,mid,k<<1,val);
}
if(R>mid){
update(L,R,mid+1,r,k<<1|1,val);
}
pushup(k);
}
}
long long query(int L,int R,int l,int r,int k){
if(L<=l&&r<=R){
return tree[k];
}else{
int mid=(l+r)>>1;
pushdown(k,l,r);
int ans=0;
if(L<=mid){
ans+=query(L,R,l,mid,k<<1);
}
if(R>mid){
ans+=query(L,R,mid+1,r,k<<1|1);
}
pushup(k);
return ans;
}
}
int main(){
n=read();
m=read();
build(1,1,n);
int opt;
long long k;
for(int i=1,x,y;i<=m;i++){
opt=read();
x=read();
y=read();
if(opt==1){
k=read();
update(x,y,1,n,1,k);
}else{
printf("%lld\n",query(x,y,1,n,1));
}
}
return 0;
}
by Nwayy @ 2023-03-31 21:34:57
@MornHus query 部分的