#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
const int sz=1e5+10;
const int sqsz=330;
const int mod=998244353;
int fact[sz*100],inv[sz*100];
int qpow(int base,int exp){
int ans=1;
while(exp!=0){
if(exp&1)ans=1ll*ans*base%mod;
base=1ll*base*base%mod,exp>>=1;
}
return ans;
}
int arr[sz],belong[sz],bl[sqsz],br[sqsz],fa[sqsz][sz],indeg[sz],sum[sqsz],mul[sqsz];
short bcnt[sqsz][sz];
std::vector<int>graph[sz];
void dfs(int u,int c){
arr[u]=c;
for(int v:graph[u])dfs(v,c);
graph[u].clear();
}
void update(int id){
for(int i=bl[id];i<=br[id];i++)
bcnt[id][arr[i]]=0,fa[id][arr[i]]=0;
for(int i=bl[id];i<=br[id];i++)
if(indeg[i]==0)dfs(i,arr[i]);
std::fill(indeg+bl[id],indeg+br[id]+1,0);
}
void build(int id){
sum[id]=0,mul[id]=1;
for(int i=bl[id];i<=br[id];i++){
if(fa[id][arr[i]]==0)fa[id][arr[i]]=i;
else graph[fa[id][arr[i]]].push_back(i),indeg[i]++;
mul[id]=1ll*mul[id]*inv[arr[i]]%mod;
sum[id]=(sum[id]+arr[i])%mod;
bcnt[id][arr[i]]++;
}
}
void modify(int l,int r,int x,int y){
if(belong[l]==belong[r]){
update(belong[l]);
for(int i=l;i<=r;i++)
if(arr[i]==x)arr[i]=y;
build(belong[l]);
return;
}
update(belong[l]);
for(int i=l;i<=br[belong[l]];i++)if(arr[i]==x)arr[i]=y;
build(belong[l]);
update(belong[r]);
for(int i=bl[belong[r]];i<=r;i++)if(arr[i]==x)arr[i]=y;
build(belong[r]);
for(int i=belong[l]+1;i<belong[r];i++){
if(fa[i][y]==0)fa[i][y]=fa[i][x],arr[fa[i][x]]=y;
else graph[fa[i][y]].push_back(fa[i][x]),indeg[fa[i][x]]++;
sum[i]=(sum[i]+1ll*bcnt[i][x]*y%mod-1ll*bcnt[i][x]*x%mod+mod)%mod;
mul[i]=1ll*mul[i]*qpow(fact[x],bcnt[i][x])%mod*qpow(inv[y],bcnt[i][x])%mod;
bcnt[i][y]+=bcnt[i][x],bcnt[i][x]=0,fa[i][x]=0;
}
}
int query(int l,int r){
int s=0,m=1;
if(belong[l]==belong[r]){
update(belong[l]);
for(int i=l;i<=r;i++)
s=(s+arr[i])%mod,m=1ll*m*inv[arr[i]]%mod;
build(belong[l]);
return 1ll*fact[s]*m%mod;
}
update(belong[l]);
for(int i=l;i<=br[belong[l]];i++)
s=(s+arr[i])%mod,m=1ll*m*inv[arr[i]]%mod;
build(belong[l]);
update(belong[r]);
for(int i=bl[belong[r]];i<=r;i++)
s=(s+arr[i])%mod,m=1ll*m*inv[arr[i]]%mod;
build(belong[r]);
for(int i=belong[l]+1;i<belong[r];i++)s=(s+sum[i])%mod,m=1ll*m*mul[i]%mod;
return 1ll*fact[s]*m%mod;
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n,q;
std::cin>>n>>q;
fact[0]=1;
for(int i=1;i<=1e7;i++)fact[i]=1ll*fact[i-1]*i%mod;
inv[10000000]=qpow(fact[10000000],mod-2);
for(int i=1e7-1;i>=0;i--)inv[i]=1ll*inv[i+1]*(i+1)%mod;
for(int i=1;i<=n;i++)std::cin>>arr[i];
int lim=std::sqrt(n)+1,num=n/lim;
for(int i=1;i<=num;i++)
bl[i]=br[i-1]+1,br[i]=i*lim;
if(br[num]!=n)
++num,bl[num]=br[num-1]+1,br[num]=n;
for(int i=1;i<=num;i++)
for(int j=bl[i];j<=br[i];j++)belong[j]=i;
for(int i=1;i<=num;i++)build(i);
while(q--){
int op,l,r,x,y;
std::cin>>op>>l>>r;
if(op==2)std::cout<<query(l,r)<<"\n";
else{
std::cin>>x>>y;
if(x==y)continue;
modify(l,r,x,y);
}
}
return 0;
}