#include<bits/stdc++.h>
using namespace std;
struct tree{
int l,r;
int sum;
int fc,fj;
}a[500000002];
void push_up(int u){
a[u].sum=a[u<<1].sum+a[u<<1|1].sum;
}
void downj(int k){
a[k<<1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].fj;
a[k<<1|1].sum+=(a[k<<1|1].r-a[k<<1|1].l+1)*a[k].fj;
a[k<<1].fj=a[k].fj;
a[k<<1|1].fj=a[k].fj;
a[k].fj=0;
}
void downc(int k){
a[k<<1].sum*=a[k].fc;
a[k<<1|1].sum*=a[k].fc;
a[k<<1].fc=a[k].fc;
a[k<<1|1].fc=a[k].fc;
a[k].fc=0;
}
void build(int k,int l,int r){
if(l==r){
int t;
scanf("%d",&t);
a[k].sum=t;
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
push_up(k);
return;
}
void ch(int u,int l,int r,int x){
if(a[u].l>=l and a[u].r<=r){
a[u].sum*=x;
a[u].fc+=x;
downc(u);
return;
}
int mid=a[u].l+a[u].r>>1;
if(l<=mid) ch(u<<1,l,r,x);
if(r>mid) ch(u<<1|1,l,r,x);
//return;
}
void pl(int u,int l,int r,int x){
if(a[u].l>=l and a[u].r<=r){
a[u].sum+=(a[u].r-a[u].l+1)*x;
a[u].fj+=x;
downj(u);
return;
}
int mid=(a[u].l+a[u].r)>>1;
if(l<=mid) ch(u<<1,l,r,x);
if(mid<r) ch(u<<1|1,l,r,x);
return;
}
long long ask(int u,int l,int r){
if(a[u].l>=l and a[u].r<=r){
if(a[u].fc){
downc(u);
}
if(a[u].fj){
downj(u);
}
return a[u].sum;
}
int mid=a[u].l+a[u].r>>1;
int v=0;
if(l<=mid){
v=ask(u<<1,l,r);
}
if(r>mid) v+=ask(u<<1|1,l,r);
return v;
}
int main(){
int n,q,m;
scanf("%d%d%d",&n,&q,&m);
build(1,1,n);
int x,y,k;
for(int i=0;i<q;i++){
int t1;
scanf("%d",&t1);
if(t1==1){
scanf("%d%d%d",&x,&y,&k);
ch(1,x,y,k);
}
if(t1==2){
scanf("%d%d%d",&x,&y,&k);
pl(1,x,y,k);
}
if(t1==3){
scanf("%d%d",&x,&y);
printf("%d",ask(1,x,y));
}
}
return 0;
}