#include using namespace std; struct MergeSortTree { int n, sz; bool use_sum; vector> dat; vector> sum; MergeSortTree(const vector& a,bool flag=false) { n = a.size(); use_sum = flag; sz = 1; while (sz < n) sz <<= 1; dat.resize(2 * sz); if(use_sum)sum.resize(2 * sz); // 葉 for (int i = 0; i < n; i++) dat[sz + i].push_back(a[i]); // マージ for (int i = sz - 1; i >= 1; i--) merge(dat[2 * i].begin(), dat[2 * i].end(),dat[2 * i + 1].begin(), dat[2 * i + 1].end(),back_inserter(dat[i])); // 累積和 if(use_sum)for (int i = 1; i < 2 * sz; i++) { sum[i].resize(dat[i].size() + 1); for (int j = 0; j < (int)dat[i].size(); j++) { sum[i][j + 1] = sum[i][j] + dat[i][j]; } } } private: // 1ノードについて clamp(x, lo, hi) の総和 long long node_sum_clamp(int p, long long lo, long long hi) const { int l = lower_bound(dat[p].begin(), dat[p].end(), lo) - dat[p].begin(); int r = upper_bound(dat[p].begin(), dat[p].end(), hi) - dat[p].begin(); return (long long)l * lo + (sum[p][r] - sum[p][l]) + (long long)(dat[p].size() - r) * hi; } public: // [l,r) にある全 x について clamp(x,lo,hi) の総和 long long sum_clamp(int l, int r, long long lo, long long hi) const { assert(use_sum); long long res = 0; for (l += sz, r += sz; l < r; l >>= 1, r >>= 1) { if (l & 1) res += node_sum_clamp(l++, lo, hi); if (r & 1) res += node_sum_clamp(--r, lo, hi); } return res; } }; int main(void){ int n,q; cin>>n>>q; vectorv(n); for(int i=0;i>v[i]; } MergeSortTree mst(v,1); while(q--){ int l,r; long long x; cin>>l>>r>>x; cout<