#include "bits/stdc++.h"
using namespace std ;
using ll = long long ;
const int N = 1e5 + 5 ;
int n, m, mod, a[N] ;
class Tree
{
public :
inline ll ls(ll p) {return p << 1 ;}
inline ll rs(ll p) {return p << 1 | 1 ;}
void BuildTree() {build(1, 1, n) ;}
ll Query(ll qx, ll qy, ll l, ll r, ll p) {return query(qx, qy, l, r, p) ;} ;
void UpDate(ll pl, ll pr, ll l, ll r, ll p, ll k, ll k2) {return upDate(pl, pr, l, r, p, k, k2) ;} ;
private :
ll tree[N << 2], value[N << 2], tag[N << 2], add[N << 2], multiply[N << 2] ;
void pushUp(ll p)
{
value[p] = value[ls(p)] + value[rs(p)] ;
} ;
inline void f(ll p, ll l, ll r, ll k, ll k2)
{
add[p] = add[p] + k * k2 ;
multiply[p] = multiply[p] * k2 ;
value[p] = value[p] * multiply[p] + add[p] * (r - l + 1) ;
}
inline void pushDown(ll p, ll l, ll r)
{
ll mid = (l + r) >> 1 ;
f(ls(p), l, mid, add[p], multiply[p]) ;
f(rs(p), mid + 1, r, add[p], multiply[p]) ;
add[p] = 0, multiply[p] = 1 ;
}
void build(ll p, ll l, ll r)
{
add[p] = 0, multiply[p] = 1 ;
if(l == r) {value[p] = a[l] ; return ;} ;
ll mid = (l + r) >> 1 ;
build(ls(p), l, mid) ;
build(rs(p), mid + 1, r) ;
pushUp(p) ;
}
inline void upDate(ll pl, ll pr, ll l, ll r, ll p, ll k, ll k2)
{
if(pl <= l && r <= pr)
{
f(p, l, r, k, k2) ;
return ;
}
pushDown(p, l, r) ;
ll mid = (l + r) >> 1 ;
if(pl <= mid) upDate(pl, pr, l, mid, ls(p), k, k2) ;
if(pr > mid) upDate(pl, pr, mid + 1, r, rs(p), k, k2) ;
pushUp(p) ;
}
inline ll query(ll qx, ll qy, ll l, ll r, ll p)
{
ll res = 0 ;
if(qx <= l && r <= qy) return value[p] ;
ll mid = (l + r) >> 1 ;
pushDown(p, l, r) ;
if(qx <= mid) res += query(qx, qy, l, mid, ls(p)) ;
if(qy > mid) res += query(qx, qy, mid + 1, r, rs(p)) ;
return res ;
}
} tree ;
int main()
{
ios::sync_with_stdio(false) ;
cin.tie(0) ; cout.tie(0) ;
int op, x, y, k, k2 ;
cin >> n >> m >> mod ;
for(int i = 1 ; i <= n ; ++i) cin >> a[i] ;
tree.BuildTree() ;
for(int t = 1 ; t <= m ; ++t)
{
cin >> op ;
if(op == 1)
{
cin >> x >> y >> k2 ;
tree.UpDate(x, y, 1, n, 1, 0, k2) ;
}
else if(op == 2)
{
cin >> x >> y >> k ;
tree.UpDate(x, y, 1, n, 1, k, 0) ;
}
else
{
cin >> x >> y ;
cout << tree.Query(x, y, 1, n, 1) << endl ;
}
}
return 0 ;
}