include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
typedef long long ll;
const int N = 1e6;
int n,m,x,y,k,op;
ll tag[N4],tr[N4],a[N];
void pushup(int u)
{
// TODO: 利用左右儿子信息维护当前节点的信息
tr[u] = tr[u << 1]+tr[u << 1|1];
}
void pushdown(int u,int l,int r)
{
// TODO: 将懒标记下传
if(tag[u])
{
int mid = (l + r) >> 1;
ll lazy = tag[u];
tag[u << 1] += lazy;
tag[u << 1|1] += lazy;
tr[u << 1] += (mid - l + 1)lazy;
tr[u << 1|1] += (r - mid)lazy;
tag[u] = 0;
}
}
void build(int u, int l, int r)
{
if (l == r) tr[u] = a[r];
else
{
// tr[u] = {l, r};
int mid = (l + r) >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void update(int u, int l, int r, int L,int R,int d)
{
if (l >= L && r <= R)
{
tr[u] += (r-l+1)*d;
tag[u] += d;
// TODO: 修改区间
}
else
{
pushdown(u,l,r);
int mid = (l + r) >> 1;
if (L <= mid) update(u << 1, l, mid, L, R, d);
if (R > mid) update(u << 1 | 1, mid+1, r, L, R, d);
pushup(u);
}
}
ll query(int u, int l, int r,int L,int R)
{
if (L <= l && R >= r)
{
return tr[u]; // TODO 需要补充返回值
}
else
{
pushdown(u,l,r);
int mid = (l + r) >> 1;
ll res = 0;
if (L <= mid ) res = query(u << 1, l,mid, L, R);
if (R > mid) res += query(u << 1 | 1, mid+1, r, L, R);
return res;
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
cin >> a[i];
build(1,1,n);
while (m – )
{
cin >> op;
if(op == 1)
{
cin >> x >> y >> k;
update(1,1,n,x,y,k);
}
else
{
cin >> x >> y;
cout << query(1,1,n,x,y) <<endl;
}
}
return 0;
}