#include<bits/stdc++.h>
using namespace std;
int n,q,m;
long long data1[100001];
long long tree[400001];
long long lazy[400001];
long long lazy2[400001];
void build(int node,int l,int r){
if(l==r){
tree[node] = data1[l];
return;
}
int mid = (l+r)/2;
build(2*node,l,mid);
build(2*node+1,mid+1,r);
tree[node] = tree[2*node] + tree[2*node+1];
}
void pushdown(int node,int l,int r){
if(lazy[node] == 0 and lazy2[node] == 1)return;
int mid = (l+r)/2;
tree[2*node] *= lazy2[node];
tree[2*node+1] *= lazy2[node];
tree[2*node] += lazy[node]*(mid-l+1);
tree[2*node+1] += lazy[node]*(r-mid);
lazy[2*node] *= lazy2[node];
lazy[2*node] += lazy[node];
lazy[2*node+1] *= lazy2[node];
lazy[2*node+1] += lazy[node];
lazy2[2*node] *= lazy2[node];
lazy2[2*node+1] *= lazy2[node];
lazy[node] = 0;
lazy2[node] = 1;
}
void update1(int node,int l,int r,int ul,int ur,long long val){
if(r<ul or l>ur) return;
if(l>=ul and r<=ur){
if(lazy2[node] != 1){
pushdown(node,l,r);
}
tree[node]+=val*(r-l+1);
lazy[node]+=val;
return;
}
pushdown(node,l,r);
int mid = (l+r)/2;
update1(2*node,l,mid,ul,ur,val);
update1(2*node+1,mid+1,r,ul,ur,val);
tree[node] = tree[2*node]+tree[2*node+1];
}
void update2(int node,int l,int r,int ul,int ur,long long val){
if(r<ul or l>ur) return;
if(l>=ul and r<=ur){
tree[node]*=val;
lazy[node]*=val;
lazy2[node]*=val;
return;
}
pushdown(node,l,r);
int mid = (l+r)/2;
update2(2*node,l,mid,ul,ur,val);
update2(2*node+1,mid+1,r,ul,ur,val);
tree[node] = tree[2*node]+tree[2*node+1];
}
long long get1(int node,int l,int r,int ul,int ur){
if(r<ul or l>ur) return 0 ;
if(l>=ul and r<=ur){
return tree[node];
}
int mid = (l+r)/2;
pushdown(node,l,r);
return get1(2*node,l,mid,ul,ur)+get1(2*node+1,mid+1,r,ul,ur);
}
int main(){
for (int i = 0; i < 400001; i++) {
lazy2[i] = 1;
}
cin >> n >> q >> m;
for(int i=1;i<=n;i++){
cin >> data1[i];
}
bool b1 = false;
for(int i=1;i<=q;i++){
int p;
cin >> p;
if(p==1){
int x,y,k;
cin >> x >> y >> k;
update2(1,1,n,x,y,k);
}
if(p==2){
int x,y,k;
cin >> x >> y >> k;
update1(1,1,n,x,y,k);
}
if(p==3){
int x,y;
cin >> x >> y;
if(b1) cout << endl;
b1=true;
cout << get1(1,1,n,x,y);
}
}
return 0;
}