#include<iostream>
using namespace std;
const int N=6e5+5;
//#define int long long
struct node{
int l,r;
int tag,sum;
}t[N<<2];
void push_down(int l,int r,int c){
t[c*2].sum+=(t[c*2].r-t[c*2].l+1)*t[c].tag;
t[c*2+1].sum+=(t[c*2+1].r-t[c*2+1].l+1)*t[c].tag;
t[c*2].tag+=t[c].tag;
t[c*2+1].tag+=t[c].tag;
t[c].tag=0;
}
void build(int l,int r,int c){
t[c].l=l;t[c].r=r;
if(l==r){
cin>>t[c].sum;
return;
}
int mid=(l+r)>>1;
build(l,mid,c*2);
build(mid+1,r,c*2+1);
t[c].sum=t[c*2].sum+t[c*2+1].sum;
return;
}
int query(int l,int r,int c){
if(l<=t[c].l&&r>=t[c].r) return t[c].sum;
if(t[c].tag) push_down(l,r,c);
int mid=(l+r)>>1;
int ans=0;
if(l<=mid) ans+=query(l,r,c*2);
if(r>mid) ans+=query(l,r,c*2+1);
return ans;
}
void modify(int l,int r,int c,int k){
if(l<=t[c].l&&r>=t[c].r){
t[c].tag+=k;
t[c].sum+=(t[c].r-t[c].l+1)*k;
return;
}
if(t[c].tag) push_down(l,r,c);
int mid=(l+r)>>1;
if(l<=mid) modify(l,r,c*2,k);
if(r>mid) modify(l,r,c*2+1,k);
t[c].sum=t[c*2].sum+t[c*2+1].sum;
return;
}
signed main(){
int n;
cin>>n;
build(1,n,1);
int q,op,x,y,k;
cin>>q;
while(q--){
cin>>op;
if(op==1){
cin>>x>>y>>k;
modify(x,y,1,k);
}else{
cin>>x>>y;
cout<<query(x,y,1)<<'\n';
}
}
return 0;
}
一道区间查询和区间修改的线段树基本题,rt喜提RE