样例能过,测试点第一个就wa了
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll MAXN = 1e5 + 10;
int n, m;
struct node {
ll l, r;
ll data;
ll lazy;
} tree[MAXN << 2];
ll a[MAXN];
void build(ll p, ll l, ll r) {
tree[p].l = l;
tree[p].r = r;
if (l == r) {
tree[p].data = a[l];
return;
}
ll mid = (l + r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
tree[p].data = tree[p << 1].data + tree[p << 1 | 1].data;
}
ll addlazy(ll p, ll val) {
tree[p].lazy = val;
tree[p].data += (tree[p].r - tree[p].l + 1) * val;
}
ll pushdown(ll p) {
addlazy(p << 1, tree[p].lazy);
addlazy(p << 1 | 1, tree[p].lazy);
tree[p].lazy = 0;
}
ll query(ll p, ll l, ll r) {
if (tree[p].l >= l && tree[p].r <= r) {
return tree[p].data;
}
pushdown(p);
ll res = 0;
if (tree[p << 1].r >= l) res += query(p << 1, l, r);
if (tree[p << 1 | 1].l <= r) res += query(p << 1 | 1, l, r);
return res;
}
void modify(ll p, ll l, ll r, ll val) {
if (tree[p].l >= l && tree[p].r <= r) {
addlazy(p, val);
return;
}
pushdown(p);
if (tree[p << 1].r >= l) modify(p << 1, l, r, val);
if (tree[p << 1 | 1].l <= r) modify(p << 1 | 1, l, r, val);
tree[p].data = tree[p << 1].data + tree[p << 1 | 1].data;
}
int main() {
cin >> n >> m;
for (ll i = 1; i <= n; i ++) cin >> a[i];
build(1, 1, n);
for (ll i = 1; i <= m; i ++) {
int opt, x, y, k;
cin >> opt;
if (opt == 1) {
cin >> x >> y >> k;
modify(1, x, y, k);
}
else {
cin >> x >> y;
cout << query(1, x, y) << endl;
}
}
return 0;
}