tle on 6 12
#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r;
mutable long long v;
node(int L,int R=-1,int V=0):l(L),r(R),v(V){}
bool operator<(const node& o) const{
return l<o.l;
}
};
set<node> s;
int n,m;
#define IT set<node>::iterator
IT split(int pos){
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos)return it;
it--;
int L=it->l,R=it->r;
long long V=it->v;
s.erase(it);
s.insert(node(L,pos-1,V));
return s.insert(node(pos,R,V)).first;
}
void assign(int l,int r,long long v){
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,v));
}
void add(int l,int r,long long v){
IT itr=split(r+1),itl=split(l);
for(IT it=itl;it!=itr;it++)it->v+=v;
}
void mul(int l,int r,long long v){
IT itr=split(r+1),itl=split(l);
for(IT it=itl;it!=itr;it++)it->v*=v;
}
int find(int l,int r){
IT itr=split(r+1),itl=split(l);
int ans=0;
for(IT it=itl;it!=itr;it++){
if(it->v==42||it->v==424||it->v==4242||it->v==42424||it->v==424242){
ans+=(it->r-it->l+1);
}
}
return ans;
}
int main(){
cin>>n>>m;
int L=1,R=1,pos=n,prew,w;scanf("%d",&prew);
while(pos-->1) {
scanf("%d",&w);
if(w==prew){
R++;continue;
}
s.insert(node(L,R,prew));
L=++R;prew=w;
}s.insert(node(L,R,prew));
for(int i=1,opt,l,r,v;i<=m;i++){
scanf("%d%d%d",&opt,&l,&r);
if(opt==4){
printf("%d\n",find(l,r));
continue;
}
scanf("%d",&v);
if(opt==1)add(l,r,v);
else if(opt==2)mul(l,r,v);
else if(opt==3)assign(l,r,v);
}
return 0;
}