```cpp
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int A = 100000+5;
ll a[A];
ll c[4*A];
ll mark[A*4];
void push_down(ll x, ll len)
{
mark[x*2] += mark[x];
mark[x*2+1] += mark[x];
c[x*2] += mark[x] * (len - len/2);
c[x*2+1] += mark[x] * (len/2);
mark[x] = 0;
}
void push_up(ll x)
{
c[x] = c[2*x] + c[2*x+1];
}
void build(ll l, ll r, ll x)
{
if(l==r)
{
c[x] = a[l];
return ;
}
build(l,(l+r)/2,2*x);
build((l+r)/2+1,r,2*x+1);
push_up(x);
}
long long Q(ll l, ll r, ll L, ll R, ll x)
{
if(L <= l and r <= R) return c[x];
ll mid = (l+r)/2;
push_down(x,r-l+1);
long long ans = 0;
if(mid >= L) ans += Q(l,mid,L,R,2*x);
if(mid < R) ans += Q(mid+1,r,L,R,2*x+1);
return ans;
}
void upd(ll l, ll r, ll L, ll R, ll x, ll jia)
{
if(L > l and r > R) return ;
if(L <= l and r <= R){
c[x] += (r-l+1)*jia;
if(l!=r) mark[x] += jia;
return ;
}
ll mid = (l+r)/2;
push_down(x,r-l+1);
upd(l,mid,L,R,2*x,jia);
upd(mid+1,r,L,R,2*x+1,jia);
push_up(x);
}
signed main()
{
ios::sync_with_stdio(false);
int n, m;
cin>>n>>m;
for(int i = 1; i <= n; i++) cin>>a[i];
build(1,n,1);
for(int i = 1; i <= m; i++)
{
ll t, x, y;
cin>>t>>x>>y;
if(t==1)
{
ll temp; cin>>temp;
upd(1,n,x,y,1,temp);
}
else cout<<Q(1,n,x,y,1)<<endl;
}
return 0;
}
```
by WRuperD @ 2021-07-17 15:30:54
`upd`写错了
```cpp
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int A = 100000+5;
ll a[A];
ll c[4*A];
ll mark[A*4];
void push_down(ll x, ll len)
{
mark[x*2] += mark[x];
mark[x*2+1] += mark[x];
c[x*2] += mark[x] * (len - len/2);
c[x*2+1] += mark[x] * (len/2);
mark[x] = 0;
}
void push_up(ll x)
{
c[x] = c[2*x] + c[2*x+1];
}
void build(ll l, ll r, ll x)
{
if(l==r)
{
c[x] = a[l];
return ;
}
build(l,(l+r)/2,2*x);
build((l+r)/2+1,r,2*x+1);
push_up(x);
}
long long Q(ll l, ll r, ll L, ll R, ll x)
{
if(L <= l and r <= R) return c[x];
ll mid = (l+r)/2;
push_down(x,r-l+1);
long long ans = 0;
if(mid >= L) ans += Q(l,mid,L,R,2*x);
if(mid < R) ans += Q(mid+1,r,L,R,2*x+1);
return ans;
}
void upd(ll l, ll r, ll L, ll R, ll x, ll jia)
{
if(L <= l and r <= R){
c[x] += (r-l+1)*jia;
if(l!=r) mark[x] += jia;
return ;
}
ll mid = (l+r)/2;
push_down(x,r-l+1);
if(L <= mid) upd(l,mid,L,R,2*x,jia);
if(R > mid) upd(mid+1,r,L,R,2*x+1,jia);
push_up(x);
}
signed main()
{
ios::sync_with_stdio(false);
int n, m;
cin>>n>>m;
for(int i = 1; i <= n; i++) cin>>a[i];
build(1,n,1);
for(int i = 1; i <= m; i++)
{
ll t, x, y;
cin>>t>>x>>y;
if(t==1)
{
ll temp; cin>>temp;
upd(1,n,x,y,1,temp);
}
else cout<<Q(1,n,x,y,1)<<endl;
}
return 0;
}
```
by _Emiria_ @ 2021-07-17 16:21:57
当然,也可以把 upd 里的
```cpp
if(L > l and r > R) return ;
```
改为
```cpp
if(R < l || r < L) return ;
```
by Froranzen @ 2021-07-17 16:22:38
之前那位大佬的写法也是对的
by Froranzen @ 2021-07-17 16:22:59
@[椋枨](/user/361432) @[蒟蒻且网抑fks](/user/287868) thx
by WRuperD @ 2021-07-17 16:23:26
@[蒟蒻且网抑fks](/user/287868) sto,最优解第一页全是你,orz
by WRuperD @ 2021-07-17 16:25:38
@[椋枨](/user/361432) orz orz orz orz
by _Emiria_ @ 2021-07-17 16:28:43
@[蒟蒻且网抑fks](/user/287868) 假假
by Froranzen @ 2021-07-17 16:30:51