#include #include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using ull = unsigned long long; static inline ll fast_read() { int c = getchar_unlocked(); while (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f') { c = getchar_unlocked(); } bool negative = false; if (c == '-' || c == '+') { negative = c == '-'; c = getchar_unlocked(); } ull value = 0; while ('0' <= c && c <= '9') { value = value * 10 + (ull)(c - '0'); c = getchar_unlocked(); } if (c != EOF) { ungetc(c, stdin); } return negative ? -(ll)value : (ll)value; } static inline void fast_write(ll v) { char buf[24]; int n = 0; ull u = v < 0 ? 0ULL - (ull)v : (ull)v; if (v < 0) { putchar_unlocked('-'); } do { buf[n++] = (char)('0' + u % 10); u /= 10; } while (u); while (n) { putchar_unlocked(buf[--n]); } putchar_unlocked('\n'); } ll op(ll a, ll b) { return a + b; } ll e() { return 0; } int main() { ll n, q; n = fast_read(); q = fast_read(); vector as(n); for (auto &a : as) { a = fast_read(); } vector> as_sorted(n); for (ll i = 0; i < n; i++) { as_sorted[i] = {i, as[i]}; } sort(as_sorted.begin(), as_sorted.end(), [](auto &a, auto &b) { return a.second > b.second; }); segtree tree(n), cnt(n); vector> qs; for (ll i = 0; i < q; i++) { ll t, l, r, x; t = fast_read(); l = fast_read(); r = fast_read(); x = fast_read(); qs.push_back({i, l - 1, r, x}); } sort(qs.begin(), qs.end(), [](auto &a, auto &b) { return get<3>(a) > get<3>(b); }); vector ans(q, 0); ll k = 0; for (auto &[i, l, r, x] : qs) { while (k < n && as_sorted[k].second >= x) { tree.set(as_sorted[k].first, as_sorted[k].second); cnt.set(as_sorted[k].first, 1); k++; } ans[i] = tree.prod(l, r) - x * cnt.prod(l, r); } for (ll i = 0; i < q; i++) { fast_write(ans[i]); } }