#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int maxn = 1e5;
int a[maxn + 5],lzy[maxn * 4 + 5],w[maxn * 4 + 5];
bool in_range(int L,int R,int l,int r){
return (l <= L) && (R <= r);
}
bool out_range(int L,int R,int l,int r){
return (L > r) && (R > l);
}
void maketag(const int u,int len,int x){
lzy[u] += x;
w[u] += len * x;
}
void pushdown(const int u,int l,int r){
int m = (l + r) / 2;
maketag(u * 2,m - l + 1,lzy[u]),maketag(u * 2 + 1,r - m,lzy[u]);
lzy[u] = 0;
}
void pushup(const int u){
w[u] = w[u * 2] + w[u * 2 + 1];
}
void built(const int u,int l,int r){
if(l == r){
w[u] = a[l];
return;
}
int m = (l + r) / 2;
built(u * 2,l,m),built(u * 2 + 1,m + 1,r);
}
int query(const int u,int L,int R,int l,int r){
if(in_range(L,R,l,r)){
return w[u];
}else{
if(out_range(L,R,l,r)){
return 0;
}else{
int m = (L + R) / 2;
pushdown(u,L,R);
return query(u * 2,L,m,l,r) + query(u * 2 + 1,m + 1,R,l,r);
}
}
}
void update(const int u,int L,int R,int l,int r,int x){
if(in_range(L,R,l,r)){
maketag(u,R - L + 1,x);
}else{
if(out_range(L,R,l,r)){
return;
}else{
int m = (L + R) / 2;
pushdown(u,L,R);
update(u * 2,L,m,l,r,x),update(u * 2 + 1,m + 1,R,l,r,x);
pushup(u);
}
}
}
int n,m;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> a[i];
}
built(1,1,n);
for(int i = 1,opt;i <= m;i++){
cin >> opt;
if(opt == 1){
int x,y,k;
cin >> x >> y >> k;
update(1,1,n,x,y,k);
}else{
int x,y;
cin >> x >> y;
cout << query(1,1,n,x,y) << endl;
}
}
return 0;
}
不知道,为什么 RE ,求大佬指点。
@I_AK_CTSC @keep_shining