#include using namespace std; typedef long long ll; const int N = 2e5 + 3; const int INF = 1e9; int n, k, m, s[N]; struct Segment_Tree{ struct Node{ int mx, cnt; ll sum; Node(){} Node(int val){ mx = (val == m) ? -INF : val; sum = val; cnt = (val == m); } friend Node merge(const Node &l, const Node &r){ Node ret; ret.mx = max(l.mx, r.mx); ret.sum = l.sum + r.sum; ret.cnt = l.cnt + r.cnt; return ret; } }; Node nd[4 * N]; int lp[4 * N]; void init(int i = 0, int l = 1, int r = n){ if(l == r){ nd[i] = Node(s[l]); return; } int mid = (l + r) >> 1; init(2 * i + 1, l, mid); init(2 * i + 2, mid + 1, r); nd[i] = merge(nd[2 * i + 1], nd[2 * i + 2]); } void push(int i, int l, int r){ if(!lp[i]) return; nd[i].mx += lp[i]; nd[i].sum += (ll)(r - l + 1 - nd[i].cnt) * lp[i]; if(l != r){ lp[2 * i + 1] += lp[i]; lp[2 * i + 2] += lp[i]; } lp[i] = 0; } int find_big(int l2, int r2, int c, int i = 0, int l = 1, int r = n){ //cout << "find_big " << l2 << " " << r2 << " " << c << " " << i << " " << l << " " << r << endl; push(i, l, r); //cout << nd[i].mx << " mx" << endl; if(r2 < l || r < l2) return -1; if(l2 <= l && r <= r2 && nd[i].mx + c < m) return -1; if(l == r) return l; int mid = (l + r) >> 1; int l_val = find_big(l2, r2, c, 2 * i + 1, l, mid); if(l_val != -1) return l_val; return find_big(l2, r2, c, 2 * i + 2, mid + 1, r); } void make_big(int pos, int i = 0, int l = 1, int r = n){ push(i, l, r); if(pos < l || r < pos) return; if(l == r){ nd[i] = Node(m); return; } int mid = (l + r) >> 1; make_big(pos, 2 * i + 1, l, mid); make_big(pos, 2 * i + 2, mid + 1, r); nd[i] = merge(nd[2 * i + 1], nd[2 * i + 2]); } void update(int l2, int r2, int c, int i = 0, int l = 1, int r = n){ push(i, l, r); if(r2 < l || r < l2) return; if(l2 <= l && r <= r2){ lp[i] += c; push(i, l, r); return; } int mid = (l + r) >> 1; update(l2, r2, c, 2 * i + 1, l, mid); update(l2, r2, c, 2 * i + 2, mid + 1, r); nd[i] = merge(nd[2 * i + 1], nd[2 * i + 2]); } ll query(int l2, int r2, int i = 0, int l = 1, int r = n){ push(i, l, r); if(r2 < l || r < l2) return 0; if(l2 <= l && r <= r2) return nd[i].sum; int mid = (l + r) >> 1; return query(l2, r2, 2 * i + 1, l, mid) + query(l2, r2, 2 * i + 2, mid + 1, r); } } st; //query tryabva da e long long void input(string s){ freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); input("investments"); cin >> n >> m >> k; for(int i = 1; i <= n; ++i) cin >> s[i]; st.init(); for(int i = 0; i < k; ++i){ int type; cin >> type; if(type == 1){ int l, r, c; cin >> l >> r >> c; while(true){ int pos = st.find_big(l, r, c); if(pos == -1) break; //cout << "pos " << pos << endl; st.make_big(pos); } st.update(l, r, c); } else{ int l, r; cin >> l >> r; cout << st.query(l, r) << "\n"; } } }