明明开到4e5,但是为什么不够大呢
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lch (R << 1)
#define rch ((R << 1) | 1)
#define mid ((l + r) >> 1)
ll N, M, dis, x, y, z;
struct Tree {
ll val[100050], tree[400050], tag[400050];
void Push_up(ll R){tree[R] = tree[lch] + tree[rch];}
void Push_down(ll R, ll l, ll r) {
tag[lch] += tag[R];
tag[rch] += tag[R];
tree[lch] += (mid - l + 1) * tag[R];
tree[rch] += (r - mid) * tag[R];
tag[R] = 0;
}
void Build(ll R, ll l, ll r) {
tag[R] = 0;
if(l == r) {tree[R] = val[l]; return;}
Build(lch, l, mid);
Build(rch, mid + 1, r);
Push_up(R);
}
void Update(ll R, ll l, ll r, ll ql, ll qr, ll delta) {
if(l >= ql && r <= qr) {
tree[R] += (r - l + 1) * delta;
tag[R] += delta;
return;
}
Push_down(R, l, r);//如果不下放,有lazy_tag的节点会被旧的(未被更新的)子节点更新
if(ql <= mid) Update(lch, l, mid, ql, qr, delta);//ql,qr不要动
if(mid + 1 <= qr) Update(rch, mid + 1, r, ql, qr, delta);//
Push_up(R);
}
ll Query(ll R, ll l, ll r, ll ql, ll qr) {
Push_down(R, l, r);
if(ql <= l && qr >= r)return tree[R];
ll Sum = 0;
if(ql <= mid) Sum += Query(lch, l, mid, ql, qr);//
if(mid + 1 <= qr) Sum += Query(rch, mid + 1, r, ql, qr);//
return Sum;
}
}T;
int main()
{
cin >> N >> M;
for(int i = 1; i <= N; i++) cin >> T.val[i];
T.Build(1, 1, N);
while(M--) {
cin >> dis >> x >> y;
if(dis & 1) {
cin >> z;
T.Update(1, 1, N, x, y, z);
} else {
cout << T.Query(1, 1, N, x, y) << "\n";
}
}
return 0;
}