#include <bits/stdc++.h>
#define N 100005
#define int long long
using namespace std;
int n,m,a[N],ta[N][5],lst1,lst2,ew,num;
struct node{
int cnt[3];
int tot[3][3];
}ans[N*4];
int ls[N*4];
int rs[N*4];
void push_up(int x){
for(int i=0;i<3;i++) ans[x].cnt[i]=ans[ls[x]].cnt[i]+ans[rs[x]].cnt[i];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
ans[x].tot[i][j]=ans[ls[x]].tot[i][j]+ans[rs[x]].tot[i][j]+ans[ls[x]].cnt[i]*ans[rs[x]].cnt[j];
}
}
}
void build(int x,int l,int r){
if(l==r){
ans[x].cnt[a[l]]++;
return ;
}
int mid=(l+r)/2;
build(ls[x],l,mid);
build(rs[x],mid+1,r);
push_up(x);
}
void da(int x,int l,int r,int s,int t,int u){
int ac[3]={0},tmp[3];
int res[3][3]={0};
for(int i=0;i<3;i++){
ac[i]=0;
for(int j=0;j<3;j++)res[i][j]=0;
}
tmp[0]=s;tmp[1]=t;tmp[2]=u;
for(int i=0;i<3;i++){
ac[tmp[i]]+=ans[x].cnt[i];
for(int j=0;j<3;j++)res[tmp[i]][tmp[j]]+=ans[x].tot[i][j];
}
for(int i=0;i<3;i++)ans[x].cnt[i]=ac[i];
for(int i=0;i<3;i++)for(int j=0;j<3;j++)ans[x].tot[i][j]=res[i][j];
if(ta[x][0]==-1)ta[x][0]=s,ta[x][1]=t,ta[x][2]=u;
else{
ta[x][0]=tmp[ta[x][0]];
ta[x][1]=tmp[ta[x][1]];
ta[x][2]=tmp[ta[x][2]];
}
}
int he(node x){
return x.tot[1][0]+x.tot[2][0]+x.tot[2][1];
}
void push_down(int x,int l,int r){
int mid=(l+r)/2;
int s=ta[x][0],u=ta[x][1],t=ta[x][2];
da(ls[x],l,mid,s,t,u);
da(rs[x],mid+1,r,s,t,u);
ta[x][0]=ta[x][1]=ta[x][2]=-1;
}
int q(int l,int r,int a,int b,int &x){
if(!x)x=++num;
if(l>=a&&r<=b){
ew+=lst2*(ans[x].cnt[0]+ans[x].cnt[1])+lst1*ans[x].cnt[0];
lst1+=ans[x].cnt[1];
lst2+=ans[x].cnt[2];
return he(ans[x]);
}
if(ta[x][0]!=-1)push_down(x,l,r);
int mid=(l+r)/2;
int rt=0;
if(a<=mid)rt+=q(l,mid,a,b,ls[x]);
if(b>mid)rt+=q(mid+1,r,a,b,rs[x]);
return rt;
}
void add(int l,int r,int a,int b,int &x,int s,int t,int u){
if(!x)x=++num;
if(l>=a&&r<=b){
da(x,l,r,s,t,u);
return;
}
if(ta[x][0]!=-1)push_down(x,l,r);
int mid=(l+r)/2;
if(a<=mid)add(l,mid,a,b,ls[x],s,t,u);
if(b>mid)add(mid+1,r,a,b,rs[x],s,t,u);
push_up(x);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
memset(ta,-1,sizeof(ta));
cin>>n>>m;
for(int i=1;i<=4*n;i++){
ls[i]=(i<<1);
rs[i]=ls[i]+1;
}
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
int op,a,b,s,t,u,r=1;
ew=lst1=lst2=0;
cin>>op;
if(op==2){
cin>>a>>b>>s>>t>>u;
add(1,n,a,b,r,s,t,u);
}
else {
cin>>a>>b;
cout<<q(1,n,a,b,r)+ew<<"\n";
}
}
return 0;
}