WA了
#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 5;
struct S {
long long x, tag1, tag2, size;
} tr[N * 4];
struct A {
long long x, minn, tag, size;
} s[N * 4];
long long n, m, a[N];
void pushd(long long x) {
if (tr[x].tag1 == 0) {
return;
}
if (tr[2 * x].tag1 == 0) {
tr[2 * x].tag1 = 1;
}
if (tr[2 * x + 1].tag1 == 0) {
tr[2 * x + 1].tag1 = 1;
}
tr[2 * x].tag1 *= tr[x].tag1;
tr[2 * x + 1].tag1 *= tr[x].tag1;
tr[2 * x].tag2 = tr[x].tag2 + (tr[x].tag1 * tr[2 * x].tag2);
tr[2 * x + 1].tag2 = tr[x].tag2 + (tr[x].tag1 * tr[2 * x + 1].tag2);
tr[2 * x].x = tr[x].tag2 * tr[2 * x].size + (tr[2 * x].x * tr[x].tag1);
tr[2 * x + 1].x = tr[x].tag2 * tr[2 * x + 1].size + (tr[2 * x + 1].x * tr[x].tag1);
tr[x].tag1 = 0, tr[x].tag2 = 0;
}
void pushu(long long x) {
tr[x].x = tr[2 * x].x + tr[2 * x + 1].x;
tr[x].size = tr[2 * x].size + tr[2 * x + 1].size;
}
void pushup(long long x) {
s[x].x = s[2 * x].x + s[2 * x + 1].x;
s[x].minn = min(s[2 * x].minn, s[2 * x + 1].minn);
s[x].size = s[2 * x].size + s[2 * x + 1].size;
}
void pushdown(long long x) {
if (s[x].tag == 0) {
return;
}
s[2 * x].tag += s[x].tag, s[2 * x + 1].tag += s[x].tag;
s[2 * x].x += s[2 * x].size * s[x].tag;
s[2 * x + 1].x += s[2 * x + 1].size * s[x].tag;
s[2 * x].minn += s[x].tag, s[2 * x + 1].minn += s[x].tag;
s[x].tag = 0;
}
void build(long long x, long long l, long long r) {
if (l == r) {
s[x] = {a[l], a[l], 0, 1};
tr[x] = {0, 0, 0, 0};
return;
}
long long mid = (l + r) / 2;
build(2 * x, l, mid), build(2 * x + 1, mid + 1, r);
pushup(x), pushu(x);
}
long long E(long long x, long long l, long long r, long long sx, long long ex) {
if (l == sx && r == ex) {
return s[x].x;
}
long long mid = (l + r) / 2, ans = 0;
pushdown(x);
if (sx <= mid) {
ans += E(2 * x, l, mid, sx, min(ex, mid));
}
if (mid + 1 <= ex) {
ans += E(2 * x + 1, mid + 1, r, max(sx, mid + 1), ex);
}
return ans;
}
void D(long long x, long long l, long long r, long long sx, long long ex, long long o) {
if (s[x].size == 0) {
return;
}
if (l == sx && r == ex) {
if (s[x].minn >= o) {
s[x].minn -= o, s[x].tag -= o, s[x].x -= o * s[x].size;
return;
}
}
if (l == r) {
tr[x] = {s[x].x, 0, 0, 1};
s[x] = {0, (long long)1e9, 0, 0};
return;
}
long long mid = (l + r) / 2;
pushdown(x), pushd(x);
if (sx <= mid) {
D(2 * x, l, mid, sx, min(mid, ex), o);
}
if (mid + 1 <= ex) {
D(2 * x + 1, mid + 1, r, max(sx, mid + 1), ex, o);
}
pushup(x), pushu(x);
}
void DS(long long x, long long l, long long r, long long sx, long long ex, long long o) {
if (!tr[x].size) {
return;
}
if (l == sx && r == ex) {
if (tr[x].tag1 == 0) {
tr[x].tag1 = -1;
} else {
tr[x].tag1 = -tr[x].tag1;
}
tr[x].tag2 = o - tr[x].tag2;
tr[x].x = o * tr[x].size - tr[x].x;
return;
}
pushd(x);
long long mid = (l + r) / 2;
if (sx <= mid) {
DS(2 * x, l, mid, sx, min(ex, mid), o);
}
if (mid + 1 <= ex) {
DS(2 * x + 1, mid + 1, r, max(sx, mid + 1), ex, o);
}
pushu(x);
}
long long Sum(long long x, long long l, long long r, long long sx, long long ex) {
if (l == sx && r == ex) {
return tr[x].x;
}
long long mid = (l + r) / 2, ans = 0;
pushd(x);
if (sx <= mid) {
ans += Sum(2 * x, l, mid, sx, min(ex, mid));
}
if (mid + 1 <= ex) {
ans += Sum(2 * x + 1, mid + 1, r, max(sx, mid + 1), ex);
}
return ans;
}
void chage(long long l, long long r, long long x) {
D(1, 1, n, l, r, x);
DS(1, 1, n, l, r, x);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
long long T;
for (cin >> T; T--;) {
cin >> n >> m;
for (long long i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
for (long long op, l, r, x; m--;) {
cin >> op >> l >> r;
if (op == 1) {
cin >> x;
chage(l, r, x);
} else {
cout << E(1, 1, n, l, r) + Sum(1, 1, n, l, r) << "\n";
}
}
}
return 0;
}