#include<bits/stdc++.h>
#define int long long
#define ls i<<1
#define rs i<<1|1
using namespace std;
struct ccc{
int laz,mu,pre,maxn,minn;
}tree[1000000*4];
int a[1000000*4];
int k;
void tag(int i,int l,int r){
int mid=(l+r)>>1;
tree[ls].pre*=tree[i].mu;
tree[rs].pre*=tree[i].mu;
tree[ls].pre+=(mid-l+1)*tree[i].laz;
tree[rs].pre+=(r-mid)*tree[i].laz;
tree[ls].mu*=tree[i].mu;
tree[rs].mu*=tree[i].mu;
tree[ls].laz*=tree[i].mu;
tree[rs].laz*=tree[i].mu;
tree[ls].laz+=tree[i].laz;
tree[rs].laz+=tree[i].laz;
tree[ls].maxn*=tree[i].mu;
tree[rs].maxn*=tree[i].mu;
tree[ls].maxn+=tree[i].laz;
tree[rs].maxn+=tree[i].laz;
tree[ls].minn*=tree[i].mu;
tree[rs].minn*=tree[i].mu;
tree[ls].minn+=tree[i].laz;
tree[rs].minn+=tree[i].laz;
tree[i].laz=0;
tree[i].mu=1;
}
void build(int i,int l,int r){
tree[i].mu=1;
if(l==r){
tree[i].pre=tree[i].maxn=tree[i].minn=a[l];
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
tree[i].pre=tree[ls].pre+tree[rs].pre;
tree[i].maxn=max(tree[ls].maxn,tree[rs].maxn);
tree[i].minn=min(tree[ls].minn,tree[rs].minn);
}
void change_add (int i,int l,int r,int x,int y,int z){
if(x<=l&&y>=r){
tree[i].pre+=(r-l+1)*z;
tree[i].laz+=z;
return ;
}
tag(i,l,r);
int mid=(l+r)>>1;
if(x<=mid) change_add(ls,l,mid,x,y,z);
if(y>mid) change_add(rs,mid+1,r,x,y,z);
tree[i].pre=tree[ls].pre+tree[rs].pre;
tree[i].maxn=max(tree[ls].maxn,tree[rs].maxn);
tree[i].minn=min(tree[ls].minn,tree[rs].minn);
}
void change_mu (int i,int l,int r,int x,int y,int z){
if(x<=l&&y>=r){
tree[i].pre*=z;
tree[i].laz*=z;
tree[i].mu*=z;
return ;
}
tag(i,l,r);
int mid=(l+r)>>1;
if(x<=mid) change_mu(ls,l,mid,x,y,z);
if(y>mid) change_mu(rs,mid+1,r,x,y,z);
tree[i].pre=tree[ls].pre+tree[rs].pre;
tree[i].maxn=max(tree[ls].maxn,tree[rs].maxn);
tree[i].minn=min(tree[ls].minn,tree[rs].minn);
}
int get(int i,int l,int r,int x,int y){
if(x<=l&&y>=r)return tree[i].pre;
int ans=0;
int mid=(l+r)>>1;
if(x<=mid) ans+=get(ls,l,mid,x,y);
if(y>mid) ans+=get(rs,mid+1,r,x,y);
return ans;
}
signed main(){
int n,m;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)cin>>a[i];
int opt;
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>opt;
int x,y,z;
if(opt==1){
cin>>x>>y>>z;
change_mu(1,1,n,x,y,z);
}
else if(opt==2){
cin>>x>>y>>z;
change_add(1,1,n,x,y,z);
}
else{
cin>>x>>y;
cout<<get(1,1,n,x,y);
puts("");
}
}
return 0;
}