//建树
void build(int l,int r,int rt){
if(l == r){
scanf("%lld",&tree[rt]);
return ;
}
if(l == r){
scanf("%lld",&tree[rt]);
return ;
}
int mid=(l + r) >> 1;
build(l,mid,rt << 1);
build(mid+1,r,rt << 1|1);
build(mid+1,r,rt << 1|1);
tree[rt] = tree[rt << 1] + tree[rt << 1|1];
}
}
//区间修改需要pushdown
void pushdown(int l,int r,int rt){
if(add[rt]!=0){
int mid = (l + r) >> 1;
if(add[rt]!=0){
int mid = (l + r) >> 1;
add[rt << 1] += add[rt];
add[rt << 1|1] += add[rt];
tree[rt << 1] += add[rt] * (mid - l + 1);
tree[rt << 1|1] += add[rt] * (r - mid);
add[rt << 1|1] += add[rt];
tree[rt << 1] += add[rt] * (mid - l + 1);
tree[rt << 1|1] += add[rt] * (r - mid);
add[rt] = 0;
}
return ;
}
}
return ;
}
//更新
void update(int L,int R,int val,int l,int r,int rt){
if(L<=l&&r<=R){
tree[rt]+=(r - l + 1) * val;
add[rt] += val;
return ;
}
if(L<=l&&r<=R){
tree[rt]+=(r - l + 1) * val;
add[rt] += val;
return ;
}
pushdown(l,r,rt);
int mid = (l + r) >> 1;
if(L <= mid) update(L,R,val,l,mid,rt << 1);
if(R > mid) update(L,R,val,mid+1,r,rt << 1|1);
int mid = (l + r) >> 1;
if(L <= mid) update(L,R,val,l,mid,rt << 1);
if(R > mid) update(L,R,val,mid+1,r,rt << 1|1);
tree[rt] = tree[rt << 1] + tree[rt << 1|1];
}
}
//查询
long long query(int L,int R,int l,int r,int rt){
if(L <= l&&r <= R)return tree[rt];
if(L <= l&&r <= R)return tree[rt];
pushdown(l,r,rt);
int mid =(l+r) >> 1;
long long ans = 0;
if(L <= mid) ans += query(L,R,l,mid,rt << 1);
if(R > mid) ans += query(L,R,mid+1,r,rt << 1|1);
return ans;
}
long long ans = 0;
if(L <= mid) ans += query(L,R,l,mid,rt << 1);
if(R > mid) ans += query(L,R,mid+1,r,rt << 1|1);
return ans;
}