#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1000005;
ll a[N],sum[N << 2], tag[N << 2];
void update(ll x)
{
sum[x] = sum[x << 1] + sum[x << 1 | 1];
}//更改这个节点的值
void build(ll x, ll L, ll R) {
if(L == R) {
sum[x] = a[L];
return;
}
ll mid = (L + R) >> 1;
build(x << 1, L, mid);
build(x << 1 | 1, mid + 1, R);
update(x);
}//递归建树
void pushdown(ll x, ll L, ll R) {
if(tag[x] == 0) return;
sum[x] += tag[x] * (R - L + 1);
if(L != R) {
tag[x << 1] += tag[x];
tag[x << 1 | 1] += tag[x];
}
tag[x] = 0;
}//向下更新懒标记
void modify(ll x, ll L, ll R, ll l, ll r, ll v) {
pushdown(x, L, R);
if(L <= l && R <= r) {
tag[x] += v;
pushdown(x, L, R);
return;
}
ll mid = (L + R) >> 1;
if(r <= mid) modify(x << 1, L, mid, l, r, v);
else if(l > mid) modify(x << 1 | 1, mid+1, R, l, r, v);
else{
modify(x << 1, L, mid, l, mid, v);
modify(x << 1 | 1, mid+1, R, mid+1, r, v);
}
update(x);
}
/*
a[l...r] += v
L,R变动
*/
ll query(ll x,ll L,ll R,ll l,ll r)
{
ll res=0;
if(L<=l&&r<=R)return sum[x];
ll mid=(l+r)>>1;
pushdown(x,l,r);
if(l<=mid)res+=query(x<<1,L,mid,l,r);
else res+=query(x<<1|1,mid+1,R,l,r);
return res;
}
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
int cmd,x,y,v;
for(ll i=1;i<=m;i++)
{
scanf("%lld",&cmd);
if(cmd==1)
{
scanf("%d%d%d",&x,&y,&v);
modify(1,1,n,x,y,v);
}
else
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,x,y,1,n));
}
}
return 0;
}
应该就是query的问题