#include using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define ALL(v) (v).begin(),(v).end() #define fi first #define se second template inline bool chmax(A &a, B b) { if (a inline bool chmin(A &a, B b) { if (a>b) { a=b; return 1; } return 0; } typedef long long ll; typedef pair pii; typedef pair pll; typedef pair P; const ll INF = 1ll<<60; const ll MOD = 1000000007; const double EPS = 1e-9; const bool debug = 0; //---------------------------------// struct SegTree { int n; vector dat, sum; SegTree(int _n) { n = 1; while (n < _n) n *= 2; dat.resize(n * 2 - 1, pll(INF, 0)); sum.resize(n * 2 - 1, pll(0, 0)); } pll add(pll a, pll b) { return pll(a.fi + b.fi, a.se + b.se); } void update(int pos, pll x) { int i = pos + n - 1; dat[i] = min(dat[i], x); while (i > 0) { i = (i - 1) / 2; dat[i] = min(dat[i * 2 + 1], dat[i * 2 + 2]); } i = pos + n - 1; if (dat[i].se != -1) sum[i] = pll(x.fi, 1); else sum[i] = pll(0, 0); while (i > 0) { i = (i - 1) / 2; sum[i] = add(sum[i * 2 + 1], sum[i * 2 + 2]); } } void set(int i, pll x) { dat[i + n - 1] = x; update(i, x); } pll sumquery(int a, int b, int k = 0, int l = 0, int r = -1) { if (r < 0) r = n; if (r <= a || b <= l) return pll(0, 0); if (a <= l && r <= b) return sum[k]; return add(sumquery(a, b, k * 2 + 1, l, (l + r) / 2), sumquery(a, b, k * 2 + 2, (l + r) / 2, r)); } // 探索範囲[a,b), 現在見ているkノード[l,r) pll minquery(int a, int b, int k = 0, int l = 0, int r = -1) { if (r < 0) r = n; if (r <= a || b <= l) return pll(INF, 0); if (a <= l && r <= b) return dat[k]; return min( minquery(a, b, k * 2 + 1, l, (l + r) / 2), minquery(a, b, k * 2 + 2, (l + r) / 2, r) ); } }; int N, Q; ll ans[112345]; int main() { cin >> N >> Q; SegTree seg(N); REP(i, N) { int a; scanf("%d", &a); seg.set(i, pll(a, i)); } vector

v; REP(i, Q) { int q, l, r; cin >> q >> l >> r; l--; r--; if (q == 1) { int x; cin >> x; v.push_back(P(pii(x, i), pii(l, r))); } } sort(ALL(v)); REP(i, Q) { int x = v[i].fi.fi; int qidx = v[i].fi.se; int l = v[i].se.fi; int r = v[i].se.se + 1; pll cur; while ((cur = seg.minquery(0, N)).fi <= x) { seg.set(cur.se, pll(INF, -1)); } cur = seg.sumquery(l, r); ans[qidx] = cur.fi - cur.se * x; } REP(i, Q) printf("%lld\n", ans[i]); return 0; }