#include<bits/stdc++.h>
using namespace std;
int n,m,p,opt,x,y,k;
const int MAXN=1e5+5;
struct node{
int sum,add,mul,l,r;
}ans[MAXN*4];
int a[MAXN];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
void push_up(int p){ans[p].sum=ans[ls(p)].sum+ans[rs(p)].sum;}
void build(int p,int l,int r){
ans[p].mul=1;ans[p].add=0;ans[p].l=l;ans[p].r=r;
if(l==r){ans[p].sum=a[l];return;}
int mid=(l+r)/2;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void push_down(int p){
ans[ls(p)].sum=ans[ls(p)].sum*ans[p].mul+ans[p].add*(ans[ls(p)].r-ans[ls(p)].l+1);
ans[rs(p)].sum=ans[rs(p)].sum*ans[p].mul+ans[p].add*(ans[rs(p)].r-ans[rs(p)].l+1);
ans[ls(p)].mul=ans[ls(p)].mul*ans[p].mul;
ans[rs(p)].mul=ans[rs(p)].mul*ans[p].mul;
ans[ls(p)].add=ans[ls(p)].add*ans[p].mul+ans[p].add;
ans[rs(p)].add=ans[rs(p)].add*ans[p].mul+ans[p].add;
ans[p].mul=1;
ans[p].add=0;
}
void update(int l,int r,int p,int k){
if(l<=ans[p].l && ans[p].r<=r){
ans[p].sum+=(r-l+1)*k;
ans[p].add+=k;
return ;
}
push_down(p);
push_up(p);
int mid=(ans[p].l+ans[p].r)/2;
if(l<=mid) update(l,r,ls(p),k);
if(r>mid) update(l,r,rs(p),k);
push_up(p);
}
void Multiplication(int l,int r,int p,int k){
if(l<=ans[p].l && ans[p].r<=r){
ans[p].sum=ans[p].sum*k;
ans[p].add=ans[p].add*k;
ans[p].mul=ans[p].mul*k;
return ;
}
push_down(p);
push_up(p);
int mid=(ans[p].l+ans[p].r)/2;
if(l<=mid) Multiplication(l,r,ls(p),k);
if(r>mid) Multiplication(l,r,rs(p),k);
push_up(p);
}
int query(int l,int r,int p){
if(l<=ans[p].l && ans[p].r<=r) return ans[p].sum;
push_down(p);
int res=0;
int mid=(ans[p].l+ans[p].r)/2;
if(l<=mid) res+=query(l,r,ls(p));
if(r>mid) res+=query(l,r,rs(p));
return res;
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
while(m--){
scanf("%d",&opt);
if(opt==1){
scanf("%d%d%d",&x,&y,&k);
for(int i=1;i<=9;i++) cout<<ans[i].sum<<' ';
cout<<endl;
update(x,y,1,k);
}
else if(opt==2){
scanf("%d%d%d",&x,&y,&k);
Multiplication(x,y,1,k);
}
else{
scanf("%d%d",&x,&y);
cout<<query(x,y,1)<<endl;
}
}
return 0;
}